【问题标题】:Split words from string in Prolog在Prolog中从字符串中拆分单词
【发布时间】:2016-01-26 17:18:07
【问题描述】:

我想从字符串中拆分单词并放入 Prolog 中的列表中。

num --> [one] | [two] | [three] | [four] | [five].

?- split("onethreetwofive", Ls).
Ls = [one,three,two,five].             % expected answer

在这里,我想将匹配列表的字符串从num 中拆分出来,并将单词放入列表中。我正在使用 SWI-Prolog。有任何想法吗?谢谢!

【问题讨论】:

  • 你有尝试过什么吗?您是否在 SWI Prolog 中查找过原子和字符串处理谓词? --> 运算符用于定义 DCG。这是你想要的吗?

标签: list split prolog dcg


【解决方案1】:

使用

:- set_prolog_flag(double_quotes, 字符)。 数字 --> "一个" | “二” | “三” | “四” | “五”。 数字->“”。 数字 --> 数字,数字。

使用 SWI-Prolog 7.3.15:

?- phrase(nums, Cs)。 Cs = []; Cs = [o, n, e] ; Cs = [o, n, e, o, n, e] ; Cs = [o, n, e, o, n, e, o, n, e] ; ... ?- 短语(nums,“onethreetwofive”)。 真的 ; 错误的。

好的!接下来,我们从num//0升级到num//1,从nums//0升级到nums//1

num(one)   --> "one".
num(two)   --> "two".
num(three) --> "three".
num(four)  --> "four".
num(five)  --> "five".

nums([])     --> "".
nums([X|Xs]) --> num(X), nums(Xs).

让我们运行 OP 建议的查询!

?- phrase(nums(Ls), "onethreetwofive").
Ls = [one, three, two, five] ;
false.

【讨论】:

    【解决方案2】:

    让我们试试这个代码。
    :-set_prolog_flag(double_quotes, codes).
    any(A,K) --> {member(S,K)}, S, {atom_codes(A, S)}.
    num(S) --> any(S, ["one","two","three","four","five"]).
    nums([]) --> "".
    nums([X|Xs]) --> num(X), nums(Xs).

    split(Str,Ls):-phrase(nums(Ls),Str).

    好的,现在让我们运行查询。
    ?- split("onethreetwofive", Ls).
    Ls = [one, three, two, five] ;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      相关资源
      最近更新 更多