在 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)
不是 可证明的 ,则 Param1
和 Param2
之间存在 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
=].
旁注
您可能希望在代码中为变量指定更清晰的名称:Param1
和 Param2
可能不是最具描述性的名称。
我们还建议使用 this_formatting_convention
而不是 thisFormattingConvention
来命名谓词。它往往使事情更具可读性。
这是我想要完成的
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)
不是 可证明的 ,则 Param1
和 Param2
之间存在 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
=].
旁注
您可能希望在代码中为变量指定更清晰的名称:Param1
和 Param2
可能不是最具描述性的名称。
我们还建议使用 this_formatting_convention
而不是 thisFormattingConvention
来命名谓词。它往往使事情更具可读性。