【问题标题】:Prolog Words Function序言词功能
【发布时间】:2023-03-10 05:00:02
【问题描述】:

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

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

字符串以字符串列表的形式返回,其中单词被解析出来。

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

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

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

【问题讨论】:

    标签: string list parsing map prolog


    【解决方案1】:

    那些双引号字符串实际上是字符代码的列表。那么 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]] .
    

    edit我们可以很容易地将单词想象成原子:

    ?- 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) 中“输出”单词的位置...

    【讨论】:

    • 有没有办法让我看到实际的单词而不是返回的字符代码?这是否可能无需转换字符代码?
    • 您可以使用 format('~s', [AnyOfY]),或查看编辑后的答案。
    猜你喜欢
    • 1970-01-01
    • 2021-02-14
    • 2016-09-28
    • 2021-03-11
    • 2011-03-14
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    相关资源
    最近更新 更多