如何在swi-prolog中分割句子

时间:2010-10-20 10:36:27

标签: prolog swi-prolog dcg

我在win xp中尝试使用SWI-Prolog。我试图理解如何将Prolog中的一个句子分成单独的原子。

前:说我有这样一句话:

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

喜欢:

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

任何人都可以解释一下这是如何运作的吗?

感谢。

3 个答案:

答案 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”]