假设回溯完成如下所示。每个终点都显示成功或失败。
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>
我该怎么做?
答案 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