当减少这样的陈述时:
!(n || p)|| p &&(n || q)
我先看看NOT符号,然后使用De Morgan定律减少。
!n && !p || p &&(n || q)
此时,看起来这样可以减少。
我不能在p &&(n || q)
部分使用任何法律。
我无法在!n && !p
部分使用更多法律。
因为AND出现在OR之前,我认为我无法开始将其他部分无序地减少,例如!p || p
为True。
可以减少更多,我只是没有看到什么?
答案 0 :(得分:0)
我不确定一般减少的特定算法,但在这种情况下还有其他属性可用于进一步减少:
此步骤只是按优先顺序分组:
(!n && !p) || (p && (n || q))
使用分配:
(!n && !p) || ((p && n) || (p && q))
使用关联性和可交换性:
((!n && !p) || (n && p)) || (p && q)
我不知道是否有特定的名称,但(!n && !p) || (n && p)
相当于n == p
:
(n == p) || (p && q)
我只是首先注意到p
可以分发,这开辟了其他可能性,我解决了这个问题。第4步是一个共同的身份mentioned here, for example,但我不知道它是否有名称。
这是一个小程序,它表明真值表真的是相同的:
class Example {
static boolean f(boolean n, boolean p, boolean q) {
return !(n || p) || p && (n || q);
}
static boolean g(boolean n, boolean p, boolean q) {
return (n == p) || (p && q);
}
public static void main(String[] args) {
System.out.println("+---+---+---+-----+-----+");
System.out.println("| n | p | q | f() | g() |");
System.out.println("+---+---+---+-----+-----+");
for (int i = 0b000; i <= 0b111; ++i) {
boolean n = (i & 0b100) != 0;
boolean p = (i & 0b010) != 0;
boolean q = (i & 0b001) != 0;
boolean f = f(n, p, q);
boolean g = g(n, p, q);
System.out.printf("| %s | %s | %s | %s | %s |%n",
ch(n), ch(p), ch(q), ch(f), ch(g));
}
System.out.println("+---+---+---+-----+-----+");
}
static char ch(boolean b) { return b ? 'T' : 'F'; }
}
真相表:
+---+---+---+-----+-----+
| n | p | q | f() | g() |
+---+---+---+-----+-----+
| F | F | F | T | T |
| F | F | T | T | T |
| F | T | F | F | F |
| F | T | T | T | T |
| T | F | F | F | F |
| T | F | T | F | F |
| T | T | F | T | T |
| T | T | T | T | T |
+---+---+---+-----+-----+