Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 序言词函数_String_List_Parsing_Map_Prolog - Fatal编程技术网

String 序言词函数

String 序言词函数,string,list,parsing,map,prolog,String,List,Parsing,Map,Prolog,我是Prolog的初学者,我一直在尝试实现一段代码 本质上,输入一个字符串,其中字符串中的单词由空格、感叹号或逗号等分隔 该字符串作为字符串列表返回,其中包含已解析的单词 例如,“stack,overflow!rocks.”将返回[“stack”,“overflow”,“rocks”] 我想使用swi prolog assoc或一些映射结构来查找边界字符,但我无法理解 如果有任何帮助,我将不胜感激 那些双引号字符串实际上是字符代码列表。然后,DCG是处理解析的适当方式: :- use_modul

我是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] .

请注意“输出”字在映射列表中的位置(原子代码、原子、代码).

这些双引号字符串实际上是字符代码列表。然后,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] .

注意地图列表中“输出”单词的位置(原子代码、原子代码、代码).

有没有办法让我看到返回的实际单词而不是字符代码?不需要转换字符代码就可以了吗?您可以使用格式(“~s”、“AnyOfY”)或查看编辑后的答案。有没有办法让我查看返回的实际单词而不是字符代码?不必转换字符代码就可以这样做吗?您可以使用格式('~s',[AnyOfY]),或者查看编辑后的答案。