1

任务是:确定哪些数 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 如何检查所有谓词”?

4

1 回答 1

1

当调用失败时,Prolog 开始回溯。在某些情况下,可能需要初始化回溯的性能以找到其他解决方案。Prolog 有一个特殊的谓词fail,它调用不成功的完成,因此初始化退款。

所以,我重写了我的代码:

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).
于 2015-03-18T17:07:35.373 回答