2012-06-03 33 views
1

假設回溯如下所示完成。每個終點顯示成功或失敗。回溯控制

Ex: 

    foo(X, search_key). 

Backtracking : 
       Root 

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

Abbreviation f : fail 
       g show first character of name 

除非沒有其他辦法找到,我不會喜歡在我的下function.However使用G作爲參數,在這個例子中,由於沒有別的辦法找到,我一定要用克,在參數我下一個功能。

我該怎麼做?

回答

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 
+0

我不能得到我應該如何使用的findall。你能解釋更多,還是寫一個樣本? – user1428237

+0

以您的示例爲例,findall(X,foo(X,search_key),Results)將生成一個列表Results,其中包含foo(X,search_key)成功的X的所有值。再次,以你爲例,假設你實際上以'f'值而不是失敗成功,結果將等於[f,f,f,g,f,f,f],然後可以在我上面的答案中使用。 – Junuxx

+0

感謝您的重播 – user1428237