序言。如果Prolog找到了第一个解决方案,那么它将停止查找

序言。如果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):-

任务是:确定什么数字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):-
        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中,它似乎不会在目标成功后倒退,这是非常奇怪的。