離散數學 求主正規化

2021-07-31 09:31:00 字數 2733 閱讀 3207

輸入:命題公式的合式公式

輸出:公式的主析取正規化和主析取正規化,輸出形式為:「 mi ∨ mj ; mi ∧ mj」 ,極小項和 ∨ 符號之間有乙個空格,極大項和 ∧ 符號之間有乙個空格;主析取正規化和主合取正規化之間用「 ; 」隔開,「 ; 」前後各有乙個空格。 永真式的主合取正規化為 1 ,永假式的主析取正規化為 0 。

輸入公式的符號說明:

! 非,相當於書面符號中的 「 ¬ 」

& 與,相當於書面符號中的 「 ∧ 」

| 或,相當於書面符號中的 「 ∨ 」

- 蘊含聯結詞,相當於書面符號中的 「 → 」

+ 等價聯結詞,相當於書面符號中的 「 ↔ 」

( 前括號

) 後括號

方法一:

#include #include #include #define n 1000  

#define max 10000000

char s[n];

bool table[30]; //標記出現的字母

int explain[30]; //存放每個字母的值

int value[max];

int sum = 0;

int priority(char c)

} void postfix() //將字串處理

; int pp = -1;

char stack[n] = ;

int ps = 0;

int len = strlen(s);

for (int i = 0; i < len; i++)

if (s[i] == '!' || s[i] == '&' || s[i] == '|' || s[i] == '-' || s[i] == '+')

if (s[i] == '(')

if (s[i] == ')')

} while (ps) post[++pp] = stack[ps--];

strcpy(s, post);

int l = strlen(s);

} void settable() //統計字母的個數

for (int i = 0; i < 26; i++)

if (table[i]) sum++;

sum = pow(2, sum);

} int btoi() //將二進位制轉化為十進位制

return sum;

} int calc(int a, int b, char c) //定義運算

} int work() //判斷字串的真值

if (s[i] == '!')

int ans = calc(stack[ps - 1], stack[ps], s[i]);

stack[--ps] = ans;

} return stack[0];

} void assign()

void generate(char c) //從a開始,用遞迴對出現的字母進行0,1賦值

explain[c - 'a'] = 0;

generate(c + 1);

explain[c - 'a'] = 1;

generate(c + 1);

} void output1()

printf("m%d", i);

for (i++; i < sum; i++)

if (value[i]) printf(" ∨ m%d", i);

printf(" ; ");

} void output2()

printf("m%d", i);

for (i++; i < sum; i++)

if (!value[i]) printf(" ∧ m%d", i);

printf("\n");

} int main()

方法二:

#include#include#include#define n 1000

using namespace std;

void panduan(int b[n],int f);//賦值函式

int tkh (char sz[n], char ccu[n], int icu[n], int h0);//分級運算函式

int fkh (char sz[n], char ccu[n], int icu[n], int h0);//主運算函式

int main()

for(i1=0;i1='a' && sz[i1]<='z' || sz[i1]>='a' && sz[i1]<='z')

printf(" ; ");

} if(hq[0]==-1)//不存在合取正規化時

printf("1");

else

}printf("\n"); }

void panduan(int b[n],int f) // 二進位制賦值。 }

int tkh (char sz[n],char ccu[n],int icu[n],int h0)//分級運算函式

{ int i,j,h,s,kh=0,wz[n],a;

char xs1[n],ckh[n]; //xs1用來儲存括號內的字元 ckh用來儲存括號。

s=strlen(sz);

for(i=0;i

離散數學 求命題公式的主正規化

實現功能 輸入命題公式的合式公式,求出公式的真值表,並輸出該公式的主合取正規化和主析取正規化。輸入 命題公式的合式公式 輸出 公式的主析取正規化和主析取正規化,輸出形式為 mi mj mi mj 極小項和 符號之間有乙個空格,極大項和 符號之間有乙個空格 主析取正規化和主合取正規化之間用 隔開,前後...

大二(上)離散數學 主析取正規化與主合取正規化

include include include include include define n 50 void panduan int b n int f 賦值函式 inttkh char sz n char ccu n int icu n int h0 分級運算函式 intfkh char sz...

離散數學 筆記

1.復合命題的真值只取決於各原子命題的真值,而與它們的內容 含義無關,與原子命題之間是否有關係無關。2.命題公式 1 重言式 2 矛盾式 3 可滿足式 1.重言式 給定一命題公式,若無論對分量作怎樣的指派,其對應的真值永為真,則稱該命題為重言式或永真式 2.給定一命題公式,若無論對分量作怎樣的指派,...