:- use_module(library(clpfd)).
fact(treated=A) :- A in 0..1.
fact(numYears=B) :- B in 0..sup.
fact(numDrugs=C) :- C in 0..sup.
fact(treated2=D) :- D in 0..1.
fact(cParam=E) :- E in 0..4.
is_differentfact(X,X) :- false.
is_differentfact(Element=_,OtherElement=_) :-
dif(Element,OtherElement).
is_fakt([]).
is_fakt([X|Xs]) :-
fact(X),
maplist(is_differentfact(X),Xs),
is_fakt(Xs).
Run Code Online (Sandbox Code Playgroud)
为什么?- is_fakt(X)返回一个结果列表的答案,但在一些结果答案后它会挂起.我不知道为什么Prolog无法返回X的所有可能值.
看看以下目标(我使用来自Markus Triska的clpfd的swi-prolog):
result(Input,Result) :-
Input #> 10,
Result=decline.
result(Input,Result) :-
Input in 0..20,
Result=offer.
Run Code Online (Sandbox Code Playgroud)
可能的查询如下所示:
?- result(15,B).
B = decline ;
B = offer.
Run Code Online (Sandbox Code Playgroud)
我想添加订单或某种解决方案优先级.如果"拒绝"是有效的响应Input=15,则不应再考虑第二个目标,因此只有B=decline解决方案而不是B=offer.
我知道我可以添加一个!/0然后反过来也行不通.给我这个谓词的所有可能答案.
考虑到这个例子,a Result=offer应该只适用于Input 0..10,否则应该触发较高的先前下降目标.
当我尝试在谓词中考虑订单时,我是否认为太迫切了?