1

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

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 作为参数。

我怎样才能做到这一点 ?

4

1 回答 1

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 
于 2012-06-03T11:45:47.543 回答