string - Prolog 字函数

标签 string list parsing dictionary prolog

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

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

该字符串作为字符串列表返回,并解析出单词。

例如,“stack,overflow!rocks”。将返回 ["stack","overflow","rocks"]

我想使用 swi prolog assoc 或某些映射结构来查找边界字符,但我无法弄清楚。

如果有任何帮助,我将不胜感激!

最佳答案

那些双引号字符串实际上是字符代码的列表。那么 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(atom_codes,Atoms,Codes)中的“输出”单词位置...

关于string - Prolog 字函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11786502/

相关文章:

c - C中的多维字符串数组

python - 将字符串中的十六进制字符附加到字符串

c - 错误 : array type has incomplete element type; dynamic 2D array

list - SharePoint 列表数据源出现 HTTP 401 "Unauthorized"错误

list - 从字符串列表 a 中导出类型 A

arrays - 测试值是否在列表/数组中 (Ti-Basic)

c - 我需要读取字符串中的所有整数、数学运算符和字符

java - 如何使用 Java 从 html 源代码中解析特定信息

c - 如何在 C 中获取未格式化的可变长度字符串中的所有 float ?

python - 如何在 Python 中将字符串包装到文件中?