在 Prolog 中生成负值

Generate negated values in Prolog

这是我想要完成的

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.

相反我得到

?- fact_is_not_true(f1p1, Param2).
false.
factIsNotTrue(Param1, Param2) :-
    \+fact(Param1, Param2).

上面的代码片段表示“如果 fact(Param1, Param2) 不是 可证明的 ,则 Param1Param2 之间存在 factIsNotTrue 关系。

当你查询 factIsNotTrue(f1p1, Param2). 时,显然 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.
factIsNotTrue(Param1, Param2) :-
    dif(Param1, F),
    fact(F, Param2),
    \+ fact(Param1, Param2).

这里我们说 Param2 对于 fact(F, Param2) 为真,对于 fact(Param1, Param2) 为假,并且 Param1 不同于使用 [=16] 的 F =].

旁注

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

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