在Prolog中生成否定值

时间:2016-11-16 08:51:49

标签: prolog negation

这是我想要完成的事情

flipclock('2017-01-16T11:00:00.000Z');

我希望上面的代码能够生成以下内容

fact(f1p1, f1p2).
fact(f2p1, f2p2).
fact(f3p1, f3p2).

factIsNotTrue(Param1, Param2) :-
    \+fact(Param1, Param2).

相反,我得到

?- fact_is_not_true(f1p1, Param2).
Param2 = f2p2.
Param2 = f3p2.

2 个答案:

答案 0 :(得分:2)

factIsNotTrue(Param1, Param2) :-
    \+fact(Param1, Param2).

上面的代码段表示如果Param1不是可证明的Param2fact(Param1, Param2)之间的关系将保持{I}。

当您查询factIsNotTrue(f1p1, Param2).时,Obviosuly prolog发现fact(f1p1, f1p2)实际上是可证明的,因此查询失败。

您可以按如下方式修改代码以生成否定值:

param(f1p1).
param(f1p2).
param(f2p1).
param(f2p2).
param(f3p1).
param(f3p2).

fact(f1p1, f1p2).
fact(f2p1, f2p2).
fact(f3p1, f3p2).

factIsNotTrue(Param1, Param2):-
    param(Param1),
    param(Param2),
    \+ fact(Param1, Param2).

试运行

?- factIsNotTrue(f1p1, Param2).
Param2 = f1p1 ;
Param2 = f2p1 ;
Param2 = f2p2 ;
Param2 = f3p1 ;
Param2 = f3p2.

?- factIsNotTrue(f1p1, f1p2).
false.

答案 1 :(得分:2)

factIsNotTrue(Param1, Param2) :-
    dif(Param1, F),
    fact(F, Param2),
    \+ fact(Param1, Param2).

我们说Param2 fact(F, Param2)fact(Param1, Param2)为真,Param1为false,而F与使用dif/2的{​​{1}}不同

旁注

您可能希望在代码中为变量指定更清晰的名称:Param1Param2可能不是最具描述性的名称。

我们还建议使用this_formatting_convention而不是thisFormattingConvention来命名谓词。它往往使事情更具可读性。