因此,基本上,我试图在rule
的中间检查是否满足某些条件,但条件取决于另一个变量。
在我的情况下,如果Num1
为10,则Num2
不能为1-如果为1,则失败;如果Num1
为20,则Num2
可以不是2。
这是我想出的
do_function(Num1, Num2):-
write('first'),
((Num1 = 10, Num2 \= 1); (Num1 = 20, Num2 \= 2)),
write('last').
与之配合使用的query
:
?- do_function(20, 1).
firstlast
true.
但是有了这个query
,我得到了:
?- do_function(10, 2).
firstlast
true ;
false.
在这种情况下,由于某种原因它会写firstlast
,但是在我的实际代码中,它会做false
的第一部分,然后崩溃。
答案 0 :(得分:1)
如果可以确保仅使用绑定的参数调用检查谓词,请使用if-then-else控制构造。例如
do_function(Num1, Num2) :-
( Num1 =:= 10 ->
Num2 =\= 1
; Num1 =:= 20 ->
Num2 =\= 2
; true
).
还可以查看library(clpfd)
。根据您要解决的问题,使用约束可能是更好的选择。
答案 1 :(得分:1)
简单地翻译您的规则(并假设您的意思是N1
是20):
在我的情况下,如果
Num1
为10,则Num2
不能为1-如果为1,则失败;如果Num2
为20,则{{1 }}不能为2。
到Prolog代码:
Num2
或:
do_function(N1, N2) :- N1 is 10, N2 \= 1.
do_function(N1, N2) :- N1 is 20, N2 \= 2.