序言。如果Prolog找到了第一个解决方案,那么它将停止查找
任务是:确定什么数字a,b,c是N的除数。例如:(a=2,b=3,c=4,N=2答案是a,c) 因此,我编写了以下代码:序言。如果Prolog找到了第一个解决方案,那么它将停止查找,prolog,visual-prolog,Prolog,Visual Prolog,任务是:确定什么数字a,b,c是N的除数。例如:(a=2,b=3,c=4,N=2答案是a,c) 因此,我编写了以下代码: PREDICATES a(integer,integer) m(integer,integer,integer,integer) CLAUSES a(X,N):- 0 = X mod N, write(X). m(A,B,C,N):- a(A,N). m(A,B,C,N):-
PREDICATES
a(integer,integer)
m(integer,integer,integer,integer)
CLAUSES
a(X,N):-
0 = X mod N,
write(X).
m(A,B,C,N):-
a(A,N).
m(A,B,C,N):-
a(B,N).
m(A,B,C,N):-
a(C,N).
GOAL
m(2,3,4,2).
但若Prolog找到了第一个解决方案(在我的例子中是a=2),那个么它就会停止并显示它。但是,在我的例子中,答案是a=2,c=4。
我的问题是“Prolog如何检查所有谓词”Prolog在调用失败时开始回溯。在某些情况下,可能需要初始化回溯性能以找到其他解决方案。Prolog有一个特殊的谓词
fail
,它调用unsuccessfull finish,因此初始化退款
因此,我重写了我的代码:
PREDICATES
a(integer,integer)
m(integer,integer,integer,integer)
CLAUSES
a(X,N):-
0 = X mod N,
write(X),nl.
m(A,B,C,N):-
a(A,N),fail.
m(A,B,C,N):-
a(B,N),fail.
m(A,B,C,N):-
a(C,N).
GOAL
m(2,3,4,2).
在我看来,它应该会产生两种解决方案。我没有turboprolog,但我在gnuprolog中尝试了谓词(在将
=
转换为符合ISO标准的`=:=运算符之后),它就工作了。也许是turboprolog的一些特性。是的,你是对的,这是visualprolog的一个特性。我使用fail
谓词解决问题。谢谢。这是一种错觉,因为无论m
谓词成功还是失败,都要写出X
的值。显然,在Turbo Prolog中,它似乎不会在目标成功后倒退,这是非常奇怪的。