Prolog词功能

时间:2012-08-02 22:04:15

标签: string list parsing map prolog

我是Prolog的初学者,我一直在努力实现一段代码。

基本上,您输入一个字符串,其中字符串内的单词用空格或感叹号或逗号等分隔。

该字符串作为字符串列表返回,其中包含已解析的单词。

例如,“堆叠,溢出!岩石”。将返回[“堆叠”,“溢出”,“岩石”]

我想使用swi prolog assoc或某些地图结构来查找边界字符,但我无法弄明白。

我将不胜感激任何帮助!

1 个答案:

答案 0 :(得分:4)

这些双引号字符串实际上是字符代码的列表。然后DCG是处理解析的适当方式:

:- use_module(library(http/dcg_basics), [string//1]).

%% split input on Sep
splitter(Sep, [Chunk|R]) -->
    string(Chunk),
    (   Sep -> !, splitter(Sep, R)
    ;   [], {R = []}
    ).
上面的

Sep可以是文字或非终端。我们需要像

这样的东西
not_in_word --> [C], {\+code_type(C, alpha)}.

有这样的定义:

?- phrase(splitter(not_in_word, X), "stack,overflow!rocks.").
X = [[115, 116, 97, 99, 107], [111, 118, 101, 114, 102, 108, 111|...], [114, 111, 99, 107, 115], []] .

我们可以使用delete / 3删除空字符串:

?- phrase(splitter(not_in_word, X), "? stack,overflow!rocks."), delete(X, [], Y).
X = [[], [], [115, 116, 97, 99, 107], [111, 118, 101, 114, 102|...], [114, 111, 99, 107|...], []],
Y = [[115, 116, 97, 99, 107], [111, 118, 101, 114, 102, 108, 111|...], [114, 111, 99, 107, 115]] .

编辑我们可以轻松地将单词可视化为原子:

?- phrase(splitter(not_in_word, X), "? stack,overflow!rocks."),
   delete(X, [], Y),
   maplist(atom_codes, Z, Y).
X = [[], [], [115, 116, 97, 99, 107], [111, 118, 101, 114, 102|...], [114, 111, 99, 107|...], []],
Y = [[115, 116, 97, 99, 107], [111, 118, 101, 114, 102, 108, 111|...], [114, 111, 99, 107, 115]],
Z = [stack, overflow, rocks] .

注意maplist中的'output'字位置(atom_codes,Atoms,Codes)......