我有一个列表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] .
我在这里做错了什么?
答案 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
删除了分隔符。