我在win xp中尝试使用SWI-Prolog。我试图理解如何将Prolog中的一个句子分成单独的原子。
前:说我有这样一句话:
“这是一个字符串”
有没有办法让单个单词存储在变量中?
喜欢:
X =这个
Y =是
....
等等。
任何人都可以解释一下这是如何运作的吗?
感谢。
答案 0 :(得分:11)
我会使用atomic_list_concat / 3。参见
http://www.swi-prolog.org/pldoc/man?predicate=atomic_list_concat%2F3
通常它意味着插入一个分隔符,但由于Prolog的统一双向性,它也可以用来分割字符串给分隔符:
atomic_list_concat(L,' ', 'This is a string').
L = ['This',is,a,string]
当然,一旦完成拆分,您就可以使用列表L的元素。
答案 1 :(得分:4)
我喜欢'pat fats'的答案,但你必须在之前将你的字符串转换为原子:
..., atom_codes(Atom, String), atomic_list_concat(L, ' ', Atom), ...
如果您需要直接使用字符串,我可以在我的'arsenal'中使用此代码:
%% split input on Sep
%
% minimal implementation
%
splitter(Sep, [Chunk|R]) -->
string(Chunk),
( Sep -> !, splitter(Sep, R)
; [], {R = []}
).
作为DCG,必须以这种方式调用:
?- phrase(splitter(" ", L), "this is a string"), maplist(atom_codes, As, L).
L = [[116, 104, 105, 115], [105, 115], [97], [115, 116, 114, 105, 110|...]],
As = [this, is, a, string] .
编辑:更多解释
我忘了解释它是如何工作的:@larsman在this其他答案中很好地解释了DCG。我引用他
- &gt ;,它实际上为它添加了两个隐藏的参数。第一个是由语法规则解析的列表;第二个是解析后的“剩下的东西”。 c(F,X,[])调用列表X上的c来获得结果F,期望保留[],即解析器应该使用整个列表X.
这里我有2个参数,第一个是分隔符,第二个是构建的列表。内置字符串// 1来自SWI-Prolog库(http / dcg_basics)。这是一个非常方便的构建块,与回溯中的任何东西相匹配。这里是在分隔符或字符串结尾之前“吃掉”每个字符。完成后,我们可以递归......
答案 2 :(得分:-5)
? - split(“这是一个字符串”,“”,Out)。
Out = [“this”,“is”,“a”,“string”]