在prolog中拆分匹配列表的字符串

时间:2016-01-30 06:21:22

标签: split prolog dcg

我希望使用dcg list将分割字符串分成子字符串。
这里是我的代码
any(S, K) --> {member(S,K)}, S.
pre(S) --> any(S, ["di","tri","tetre"]).
split([]) --> "".
split([X|Xs]) --> pre(X), split(Xs).

?- phrase(split(Ls), "tridi").
Ls = [[t, r, i], [d, i]]

这里有一些错误。它被分成字母,预期答案是?- phrase(split(Ls), "tridi").
Ls = [tri,di].了解这个问题的任何想法?

1 个答案:

答案 0 :(得分:1)

对于SWI-Prolog v.7,您需要更改代码,如

any(A,K) --> {member(S,K)}, S, {atom_codes(A, S)}.
pre(S) --> any(S, [`di`,`tri`,`tetre`]).
split([])     --> "".
split([X|Xs]) --> pre(X), split(Xs).

然后

?- phrase(split(Ls), `tridi`).
Ls = [tri, di]

注意我添加了转换为任何// 1。字符串表示的基本原理是documented here

使用原始代码和查询:

?- set_prolog_flag(double_quotes, codes).
true.

?- phrase(split(Ls), "tridi").
Ls = [tri, di]