6

我正在尝试在 win xp 中使用 SWI-Prolog。我试图了解如何将 Prolog 中的句子拆分为单独的原子。

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

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

喜欢 :

X = 这个
Y = 是
....
等等。

谁能解释一下这是如何工作的?

谢谢。

4

3 回答 3

13

我会使用 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 的元素。

于 2012-02-01T00:02:29.467 回答
5

我喜欢'pat fats'的答案,但你必须先将你的字符串转换为原子:

..., atom_codes(Atom, String), atomic_list_concat(L, ' ', Atom), ...

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

%%  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。

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

于 2012-02-01T11:02:09.393 回答
-5

?-split("这是一个字符串"," ", Out).

Out=["this","is","a","string"]

于 2010-10-20T10:44:19.270 回答