2017-03-31 73 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

相关问题