您可以使用 library(clpb):
首先将表达式分配给变量 Expr:
Expr = ((A + ~C)*(B + ~C)+(~(A + ~B))
.
注意:
现在如果我们查询:
?- use_module(library(clpb)).
true.
?- Expr=((A + ~C)*(B + ~C))+(~(A + ~B)),taut(Expr,T).
false.
谓词taut/2将 clpb 表达式作为输入,如果它重言式则返回 T=1,如果表达式不能满足并且在任何其他情况下失败,则返回 T=0。因此,上述查询失败的事实意味着 Expr 不是重言式,既不能满足,也意味着可以满足。
也可以通过查询:
?- Expr=((A + ~C)*(B + ~C))+(~(A + ~B)),sat(Expr).
Expr = (A+ ~C)* (B+ ~C)+ ~ (A+ ~B),
sat(1#C#C*B),
sat(A=:=A).
Predicatesat/1
返回 True 如果布尔表达式是可满足的,并且在以下情况下给出上述表达式可满足的答案:
sat(1#C#C*B),
sat(A=:=A).
哪里'#'
是,exclusive OR
这意味着你的表达(我们从 taut/2 知道是可满足的)在满足时1#C#C*B
得到满足。
另一个不使用库的解决方案可能是:
truth(X):-member(X,[true,false]).
test_truth(A,B,C):-
truth(A),
truth(B),
truth(C),
((A->C),(B->C)->(A->C)).
例子:
?- test_truth(A,B,C).
A = B, B = C, C = true ;
false.
另外,如果我从您的评论中理解正确,请收集您可以编写的所有可能的解决方案:
?- findall([A,B,C],test_truth(A,B,C),L).
L = [[true, true, true]].
它给出了一个列表列表,其中内部列表具有[true,true,true]
上述示例中的形式,这意味着解决方案是A=true,B=true,C=true
,在上述情况下,它只有一个解决方案。
要找到所有矛盾,你可以写:
truth(X):-member(X,[true,false]).
test_truth(A,B,C):-
truth(A),
truth(B),
truth(C),
not( (\+ ((\+A; C),(\+B ; C)) ; (\+A ; B)) ).
最后一行也可以写成:
not( ( (A->C;true),(B->C;true) ) -> (A->B;true) ;true ).
例子:
?- findall([A,B,C],test_truth(A,B,C),L).
L = [[true, false, true]].