如何在swi prolog中拆分句子

如何在swi prolog中拆分句子,prolog,swi-prolog,dcg,Prolog,Swi Prolog,Dcg,我正在WinXP中试用SWI Prolog。我试图理解如何将序言中的一个句子分割成不同的原子 例:假设我有这样一句话: “这是一个字符串” 有没有办法将单个单词存储在变量中 比如: X=这 Y=is .. 等等 有人能解释一下这是怎么回事吗 谢谢。?-split(“这是一个字符串,”,Out) Out=[“this”、“is”、“a”、“string”]我会使用原子列表/3。看 通常,它意味着插入一个分隔符,但由于Prolog的双向统一性,它也可以用于拆分给定分隔符的字符串: atomic_l

我正在WinXP中试用SWI Prolog。我试图理解如何将序言中的一个句子分割成不同的原子

例:假设我有这样一句话:

“这是一个字符串”
有没有办法将单个单词存储在变量中

比如:

X=这
Y=is
..
等等

有人能解释一下这是怎么回事吗

谢谢。

?-split(“这是一个字符串,”,Out)


Out=[“this”、“is”、“a”、“string”]

我会使用原子列表/3。看

通常,它意味着插入一个分隔符,但由于Prolog的双向统一性,它也可以用于拆分给定分隔符的字符串:

atomic_list_concat(L,' ', 'This is a string').
L = ['This',is,a,string]

当然,分割完成后,您可以使用列表L的元素。

我喜欢“pat fats”的答案,但您必须先将字符串转换为atom:

…,原子代码(原子,字符串),原子列表(L,,,原子),…

如果您需要直接使用字符串,我的“阿森纳”中有以下代码:

%%  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很好地解释了DCG。我引用他的话

-->,这实际上为它添加了两个隐藏参数。第一个是要由语法规则解析的列表;第二个是解析后的“剩下的东西”。c(F,X,[])调用列表X上的c以获得结果F,期望留下[],即解析器应该使用整个列表X


这里我有两个参数,第一个是分隔符,第二个是正在构建的列表。内置字符串//1来自SWI Prolog库(http/dcg_basics)。这是一个非常方便的构建块,可以匹配回溯上的任何内容。在这里,它“吃掉”了分隔符或字符串末尾之前的每个字符。完成后,我们可以递归…

对于SWI prolog,可以使用较新版本的
split\u string/4
<代码>拆分字符串(“你好,我在这里!”、“”、“”、Temp)。