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

2021-07-11 11:49:21 字數 1841 閱讀 1021

實現功能:輸入命題公式的合式公式,求出公式的真值表,並輸出該公式的主合取正規化和主析取正規化。

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

輸出:公式的主析取正規化和主析取正規化,輸出形式為:「 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)

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()

離散數學 求主正規化

輸入 命題公式的合式公式 輸出 公式的主析取正規化和主析取正規化,輸出形式為 mi mj mi mj 極小項和 符號之間有乙個空格,極大項和 符號之間有乙個空格 主析取正規化和主合取正規化之間用 隔開,前後各有乙個空格。永真式的主合取正規化為 1 永假式的主析取正規化為 0 輸入公式的符號說明 非,...

求命題公式的主正規化

成績 100開啟時間 2017年04月6日 星期四 08 00 折扣0.8 折扣時間 2017年05月5日 星期五 08 00 允許遲交 否關閉時間 2017年05月18日 星期四 23 55 實現功能 輸入命題公式的合式公式,求出公式的真值表,並輸出該公式的主合取正規化和主析取正規化。輸入 命題公...

求命題公式的主正規化

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