輸入:命題公式的合式公式
輸出:公式的主析取正規化和主析取正規化,輸出形式為:「 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.給定一命題公式,若無論對分量作怎樣的指派,...