在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