这是我想要完成的事情
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.
答案 0 :(得分:2)
factIsNotTrue(Param1, Param2) :-
\+fact(Param1, Param2).
上面的代码段表示如果Param1
不是可证明的,Param2
和fact(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}}不同
您可能希望在代码中为变量指定更清晰的名称:Param1
和Param2
可能不是最具描述性的名称。
我们还建议使用this_formatting_convention
而不是thisFormattingConvention
来命名谓词。它往往使事情更具可读性。