控制回溯

时间:2012-06-03 11:35:31

标签: prolog

假设回溯完成如下所示。每个终点都显示成功或失败。

Ex:

    foo(X, search_key).

Backtracking :
                Root

              /   |  \
             /    |   \
            /     |    \
           /|\    |     \
          / | \   |    /|\
         /  f f   |   / | \
        /         |  f  |  f
       f          g     f

Abbreviation  f : fail
              g show first character of name

除非找不到其他方法,否则我不会在下一个函数中使用g作为参数。但是,在这个例子中,由于没有找到其他方法,我必须在下一个函数中使用g作为参数。 / p>

我该怎么做?

1 个答案:

答案 0 :(得分:1)

你必须先尝试所有的终点并将它们存储在一个列表中(大概是findall(foo...)),否则你不会知道以后是否会出现非g。

然后尝试执行下一个函数,要求X不是g。如果失败,请使用g。

avoidg(X) :-
    member(A,X),
    A \= f,
    A \= g,
    write(A).

avoidg(X):-
    member(A,X),
    A \= f, 
    write(A).

示例:

?- avoidg([f,f,f,g,f,f,f]).
g
true 

 ?- avoidg([f,f,f,g,f,f,h]).
h
true