序句如果句子条件

时间:2018-11-19 22:58:18

标签: prolog

因此,基本上,我试图在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的第一部分,然后崩溃。

2 个答案:

答案 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.