2017-03-31 69 views
0

我怎樣才能讓Prolog的回答沒有,如果search_answer沒有找到答案,並 是與L = []Prolog的回答參數=參數,而不是答案,毫無

search_answer:謂詞返回一個列表或讓我們將A作爲一個自由變量。

found_list(L) :- 
    search_answer(L). 

例如,當問found_list(L),雖然search_answer沒有找到答案,Prolog的回答仍然是。我打印L,它等於_496,一個自由變量。

鑑於上述一段代碼,found_list回答L = [...]如果search_answer發現了一個列表,否則返回L = L,而我要回答沒有

我嘗試以下,但不工作

found_list(L) :- 
    search_answer(L) , is_list(L). 

enter image description here

liar_detector是我search_answer斷言,隨着L = answer 和騙子是我found_answer

+0

因爲您的謂詞沒有實例化'L',所以'search_list(L): - 沒有辦法在任何情況下search_answer(A).'都會導致'L = [']''。它只會成功或失敗,並警告你'A'和'L'是單身人士。我認爲那不是你跑的。 – lurker

+0

我的排字錯誤,我的意思是L,我會糾正它 –

+1

在這裏發佈代碼和結果圖像快照通常不被認爲是好的做法。最好編輯你的問題,並輸入新的代碼作爲文本和結果作爲文本,除非你試圖顯示圖形結果。 – lurker

回答

2

found_list(L) :- search_answer(A).LA是單身。我假設你看到了警告。你需要修正這個謂詞纔有意義。你真的想要L = [Answer]還是L = Answer

你可以實現你的這種方式後,在做什麼:

found_list(A) :- 
    search_answer(A). 

這將失敗(導致「無」),如果search_answer(A)沒有成功,你的結果將是A,如果它成功。

如果你想要的結果的列表中的答案,你可以這樣做:

found_list([A]) :- 
    search_answer(A). 

我不知道該值的任一內容。第一個found_list/1只是一個簡單的包裝search_answer/1沒有任何額外的邏輯。第二個簡單地將search_answer/1結果中的單個元素列表。如果A已經是一個列表,則不需要將其放在括號內([...]),否則您只需在列表中獲取一個列表。我懷疑你真的想做別的事情,但沒有解釋。


針對更新的問題,下面的代碼應該工作,如果 A是一個簡單的綁定期限:

found_list(A) :- 
    search_answer(A), 
    is_list(A). 

但是,如果它的參數有,即使它的元素可以列表結構is_list/1會成功鬆綁:

| ?- X = [_], is_list(X). 

X = [_] 

yes 
| ?- 

因此,舉例來說,如果search_answer(A)A = [_]成功,那麼將found_list(A) sucee d與A = [_]

ground/1可以在這裏很有用,因爲:

| ?- ground(X). 

no 
| ?- ground([_|_]). 

no 
| ?- ground([a,b]). 

yes 
| ?- 

因此,下面的解決辦法應該工作:

found_list(A) :- 
    search_answer(A), 
    ground(A). 


如果你的目的不是回溯到 search_answer(A)如果 A不接地,但只是失敗,你可以執行 found_list/1爲:

found_list(A) :- 
    search_answer(A), 
    (ground(A) -> true ; !, false). 

但我認爲,代碼中可能存在一個更基本的問題,因爲它不應該有一種行爲,您不得不這樣做。

+0

L =答案是我想要的。我將以示例 –

+0

更新仍然無法正常工作,請參閱我的更新請 –

+0

@HakiTerror您顯示的代碼圖像對我而言並不清楚。您的代碼存在某種問題,但您的簡化示例沒有正確描述它。請清楚解釋你想要實際的謂詞。 – lurker

相關問題