在prolog中搜索一个句子

时间:2014-12-02 17:56:15

标签: prolog swi-prolog prolog-toplevel

我有一个列表L创建为:

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

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

现在我想使用成员函数在L中搜索原子。 我试过了:

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

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

我在这里做错了什么?

2 个答案:

答案 0 :(得分: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').

现在L的{​​{1}} atomic_list_concat分配可供member/2使用,让其检查会员资格。

答案 1 :(得分: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删除了分隔符。