在给定另一个变量的情况下,无论某个变量是什么,我如何检查谓词是否为真?或者,无论一个变量是什么,它都会失败?
我试图使谓词拉紧/ 1和谓词不满/ 1 如果F是重言式,那么绷紧(F)应该是真的,如果F没有解,则不满(F)应该是真的。
我有一个谓词sat / 1,如果有表达式的解决方案将会成功(并提供解决方案),如果没有,则会失败。但是它使用了一个未实例化的变量,因此我不能使用/ 1来使用它来表示不满/。
我知道如果我可以定义这两个中的任何一个,我可以用它来定义另一个(因为我可以用我的程序的其余部分来否定表达式F。)
我如何制作sat / 1:
sat(F) :- solve(F,_).
这不起作用:
unsat(F) :- not(sat(F)).
我如何根据彼此的方式定义不良/ 1和拉紧/ 1(这应该适用于我的程序的其余部分)(我将只使用其中一个,具体取决于我可以用sat / /来定义1或解决/ 2):
unsat(F) :- taut(neg(F)).
taut(F) :- unsat(neg(F)).
solve / 2的行为使得如果两个变量都被实例化并且第二个是第一个表达式的有效估值(必须为真的术语列表),它将回答为真。
即solve(p(1),[1]).
给出true
如果第二个变量未经实例化,它将找到所有可行的估值(我已经检查过这个有效)或者如果没有,则说“不”。
即:solve(p(1),V).
提供V=[1]; yes
而solve(and(p(1),neg(p(1)),V).
提供no
如何使用sat / 1或solve / 2来定义拉紧/ 1或不满/ 1?
我希望拉紧/ 1和不良/ 1如何工作的示例:
| ?- taut(or(p(1),neg(p(1)))).
yes
| ?- unsat(and(p(1),neg(p(1)))).
yes
| ?-
(我使用GNU-Prolog,如果有任何不同。)