#include <stdio.h>
/* 三个例子:真值表直接写出来验证 */
static int ex1(int A, int B, int C) { return C + (!A && B); }
static int ex1_ref(int A, int B, int C) {
int m = A*4 + B*2 + C;
return (m==1||m==2||m==3||m==5||m==7);
}
static int ex2(int A, int B, int C, int D) { return (!B && !D) || (B && D); }
static int ex2_ref(int A, int B, int C, int D) {
int m = A*8 + B*4 + C*2 + D;
return (m==0||m==2||m==5||m==7||m==8||m==10||m==13||m==15);
}
static int ex3(int A, int B, int C, int D) { return (!B) || (!A && !C && D); }
static int ex3_ref(int A, int B, int C, int D) {
int m = A*8 + B*4 + C*2 + D;
return (m==0||m==1||m==2||m==5||m==8||m==9||m==10);
}
int main(void) {
printf("--- 例1 F=C+A'B vs Sm(1,2,3,5,7) ---\n");
int bad = 0;
for (int i = 0; i < 8; i++) {
int A = i>>2 & 1, B = i>>1 & 1, C = i & 1;
int a = ex1(A,B,C), b = ex1_ref(A,B,C);
if (a != b) { bad++; printf(" MISMATCH %d%d%d: %d vs %d\n", A,B,C,a,b); }
}
printf(" %s\n", bad ? "FAIL" : "PASS");
printf("--- 例2 F=B'D'+BD vs Sm(0,2,5,7,8,10,13,15) ---\n");
bad = 0;
for (int i = 0; i < 16; i++) {
int A = i>>3 & 1, B = i>>2 & 1, C = i>>1 & 1, D = i & 1;
if (ex2(A,B,C,D) != ex2_ref(A,B,C,D)) {
bad++; printf(" MISMATCH %d%d%d%d\n", A,B,C,D);
}
}
printf(" %s\n", bad ? "FAIL" : "PASS");
printf("--- 例3 F=B'+A'C'D vs Sm(0,1,2,5,8,9,10) + d(3,11,14,15) ---\n");
bad = 0;
int dc[16] = {0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,1};
for (int i = 0; i < 16; i++) {
int A = i>>3 & 1, B = i>>2 & 1, C = i>>1 & 1, D = i & 1;
int a = ex3(A,B,C,D), b = ex3_ref(A,B,C,D);
if (dc[i]) { /* 无关项:任意值都合法 */
printf(" m%-2d 无关项 -> %d\n", i, a);
} else if (a != b) {
bad++; printf(" MISMATCH m%d: %d vs %d\n", i, a, b);
}
}
printf(" %s\n", bad ? "FAIL" : "PASS");
printf("--- 例4 冒险冗余项 BC 不改功能 ---\n");
bad = 0;
for (int i = 0; i < 8; i++) {
int A = i>>2 & 1, B = i>>1 & 1, C = i & 1;
int f1 = (A && B) || (!A && C);
int f2 = (A && B) || (!A && C) || (B && C);
if (f1 != f2) { bad++; printf(" MISMATCH %d%d%d\n", A,B,C); }
}
printf(" F=AB+A'C 与 F=AB+A'C+BC 等价: %s\n", bad ? "FAIL" : "PASS");
printf("--- 德摩根验证 ---\n");
bad = 0;
for (int i = 0; i < 4; i++) {
int A = i>>1 & 1, B = i & 1;
if (!(A && B) != (!A || !B)) bad++;
if (!(A || B) != (!A && !B)) bad++;
}
printf(" %s\n", bad ? "FAIL" : "PASS");
return 0;
}
c 本站为静态站,不提供在线运行;可复制到本地用 gcc / python 执行
from itertools import product
def check(name, fn, ref, n):
bad = []
for bits in product((0, 1), repeat=n):
if fn(*bits) != ref(*bits):
bad.append(bits)
print(f" {name}: {'PASS' if not bad else 'FAIL ' + str(bad)}")
print("--- 例1 F = C + A'B ---")
check("F(A,B,C)=C+A'B", lambda A,B,C: int(C or (not A and B)),
lambda A,B,C: int(A*4+B*2+C in (1,2,3,5,7)), 3)
print("--- 例2 F = B'D' + BD ---")
check("F(A,B,C,D)", lambda A,B,C,D: int((not B and not D) or (B and D)),
lambda A,B,C,D: int(A*8+B*4+C*2+D in (0,2,5,7,8,10,13,15)), 4)
print("--- 例3 F = B' + A'C'D ---")
ms = {0,1,2,5,8,9,10}
dc = {3,11,14,15}
bad = []
for bits in product((0,1), repeat=4):
A,B,C,D = bits
val = int((not B) or (not A and not C and D))
m = A*8+B*4+C*2+D
if m in ms and val != 1: bad.append(("ms", m))
if m not in ms and m not in dc and val != 0: bad.append(("zero", m))
print(f" F=B'+A'C'D (无关项自由): {'PASS' if not bad else 'FAIL ' + str(bad)}")
print(f" 覆盖的真 1: {sorted(ms)},全部命中")
print(f" 未用无关项的表达式 B'D'+B'C'+A'C'D 文字数 7 vs 用无关项 4")
print("--- 例4 冗余项 BC 不改功能 ---")
check("F=AB+A'C vs AB+A'C+BC",
lambda A,B,C: int((A and B) or (not A and C)),
lambda A,B,C: int((A and B) or (not A and C) or (B and C)), 3)
print("--- 德摩根 ---")
check("(AB)' = A'+B'", lambda A,B: int(not (A and B)),
lambda A,B: int((not A) or (not B)), 2)
check("(A+B)' = A'B'", lambda A,B: int(not (A or B)),
lambda A,B: int((not A) and (not B)), 2)
print("--- 分工项与最大项编号对应 ---")
S = (1,2,3,5,7)
print(f" Sm{S} 等价于 PiM{tuple(sorted(set(range(8)) - set(S)))}")
print(f" 因为 M_i = m_i', 全集减 {(0,4,6)} 即补集")
python 本站为静态站,不提供在线运行;可复制到本地用 gcc / python 执行
输出(节选):
--- 例1 F = C + A'B --- F(A,B,C)=C+A'B: PASS--- 例2 F = B'D' + BD --- F(A,B,C,D): PASS--- 例3 F = B' + A'C'D --- F=B'+A'C'D (无关项自由): PASS 覆盖的真 1: [0, 1, 2, 5, 8, 9, 10],全部命中--- 例4 冗余项 BC 不改功能 --- F=AB+A'C vs AB+A'C+BC: PASS--- 德摩根 --- (AB)' = A'+B': PASS (A+B)' = A'B': PASS Sm(1, 2, 3, 5, 7) 等价于 PiM(0, 4, 6)
评论(0)
当前浏览器不允许本地存储,评论无法保存。
还没有评论,来说两句。