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

时间:2015-03-17 08:48:41

标签: 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,N).
    m(A,B,C,N):-
        a(C,N).
GOAL
    m(2,3,4,2).

但如果Prolog找到第一个解决方案(在我的情况下a = 2),那么它会停止并显示它。但是,在我的情况下,答案将是a = 2,c = 4。 我的问题是“Prolog如何检查所有谓词”?

1 个答案:

答案 0 :(得分: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).