2014-12-02 21 views
1

一句我有一个列表L创建为:搜索在序言

atomic_list_concat(L,' ', 'This is a string'). 

L = ['This',is,a,string] 

现在我想使用成员函数来搜索一个原子升。 我想:

?- member(' is',L). 
L = [' is'|_G268] . 

?- member(is,L). 
L = [is|_G268] . 

它是什么,我做错了什么?

回答

1

尽管dasblinkenlight发布的解决方案是正确的,但它在某种程度上破坏了使用Prolog顶层的交互性。通常,您希望将您的下一个查询基于以前的解决方案。

由于这个原因,有可能通过编写reuse top-level bindings$Var其中Var是在先前的查询中使用的变量的名称。

你的情况:

?- atomic_list_concat(L, ' ', 'This is a string'). 
L = ['This', is, a, string]. 
?- member(' is', $L). 
false. 
?- member('is', $L). 
true ; 
false. 

PS:请注意,搜索' is'时,因为分离是由atomic_list_concat/3删除你不会得到一个结果。

1

交互式运行的Prolog谓词不包含状态。当您运行

atomic_list_concat(L,' ', 'This is a string'). 

解释说明你L赋值,然后忘记它的价值。当您在下一行运行member/2时,L将回到其自由变量状态。

如果你想在同一L结转,你需要保持同样的请求中,像这样:

:- atomic_list_concat(L,' ', 'This is a string'), 
    member(is, L), 
    writeln('membership is confirmed'). 

现在从atomic_list_concatL任务是提供给member/2,让它检查会员。

+0

谢谢!它有帮助。 – na899 2014-12-02 18:52:37

+0

哦!再次感谢,我是prolog和stackoverflow的新手。所以任何提示都很有用。 我有另一个问题,但我相信我不能给特定用户标记答案。我可以吗? – na899 2014-12-02 20:05:55

+1

我已经发布了另一个与序言相关的问题。 http://stackoverflow.com/questions/27258188/prolog-eliminating-cycles-from-indirect-relation 请看看。 – na899 2014-12-02 20:23:22