Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 为什么两个谓词都要求值?_Prolog_Swi Prolog - Fatal编程技术网

Prolog 为什么两个谓词都要求值?

Prolog 为什么两个谓词都要求值?,prolog,swi-prolog,Prolog,Swi Prolog,这个谓词有两个子句: abs(X, Y) :- X < 0, Y is -X. abs(X, X) :- X >= 0. 为什么它计算第二个子句并返回false?有什么办法吗?您在第一个argumentX上写了两个不相交的子句,并且惊讶于Prolog返回到第二个子句,尽管第一个子句很满意 abs(X, Y) :- X < 0, Y is -X. abs(X, X) :- X >= 0. 在这种情况下,即使第1条成功,第2条也可以成功 那么,如何避免这种情况呢?这取决于

这个谓词有两个子句:

abs(X, Y) :- X < 0, Y is -X.
abs(X, X) :- X >= 0.

为什么它计算第二个子句并返回false?有什么办法吗?

您在第一个argumentX上写了两个不相交的子句,并且惊讶于Prolog返回到第二个子句,尽管第一个子句很满意

abs(X, Y) :- X < 0, Y is -X.
abs(X, X) :- X >= 0.
在这种情况下,即使第1条成功,第2条也可以成功

那么,如何避免这种情况呢?这取决于你想完成什么。如果您想获得所有答案,请执行以下操作:

?- setof(W, abs(-5, W), Ws).
Ws = [5].
要全部打印:

?- forall(abs(-5, W), format('W = ~q~n', [W])).
W = 5
如果要告诉Prolog引擎您的谓词是确定性的,可以使用If-then-else:

abs(X, Y) :-
    (   X < 0
    ->  Y is -X
    ;   Y = X
    ).

您在第一个argumentX上写了两个不相交的子句,并惊讶于Prolog返回到第二个子句,尽管第一个子句很满意

abs(X, Y) :- X < 0, Y is -X.
abs(X, X) :- X >= 0.
在这种情况下,即使第1条成功,第2条也可以成功

那么,如何避免这种情况呢?这取决于你想完成什么。如果您想获得所有答案,请执行以下操作:

?- setof(W, abs(-5, W), Ws).
Ws = [5].
要全部打印:

?- forall(abs(-5, W), format('W = ~q~n', [W])).
W = 5
如果要告诉Prolog引擎您的谓词是确定性的,可以使用If-then-else:

abs(X, Y) :-
    (   X < 0
    ->  Y is -X
    ;   Y = X
    ).

有办法吗?当然要剪!那么你已经吃了禁地知识树上的食物。注意这里有一个微妙的区别:abs1+0,X现在成功,X=1+0,而abs-1+0,X成功,X=1@nicomp:您的问题不是针对SWI的,因此SWI标签不合适。是否有解决方法?当然要剪!那么你已经吃了禁地知识树上的食物。注意这里有一个微妙的区别:abs1+0,X现在成功,X=1+0,而abs-1+0,X成功,X=1@nicomp:您的问题不是针对SWI的,因此SWI标签不合适。。。。如果您仍然支持isoprolog:absX,Y:-Y是absX。。。。如果您仍然支持isoprolog:absX,那么Y:-Y是absX。