在found_list(L) :- search_answer(A).
都L
和A
是單身。我假設你看到了警告。你需要修正這個謂詞纔有意義。你真的想要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).
但我認爲,代碼中可能存在一個更基本的問題,因爲它不應該有一種行爲,您不得不這樣做。
因爲您的謂詞沒有實例化'L',所以'search_list(L): - 沒有辦法在任何情況下search_answer(A).'都會導致'L = [']''。它只會成功或失敗,並警告你'A'和'L'是單身人士。我認爲那不是你跑的。 – lurker
我的排字錯誤,我的意思是L,我會糾正它 –
在這裏發佈代碼和結果圖像快照通常不被認爲是好的做法。最好編輯你的問題,並輸入新的代碼作爲文本和結果作爲文本,除非你試圖顯示圖形結果。 – lurker