在序言中用匹配列表拆分字符串

split string with matching list in prolog

我想使用 dcg 列表将字符串拆分为子字符串。
这里是我的代码
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]]

这里一些error.it被拆分为字母,预期答案是
?- phrase(split(Ls), "tridi").
Ls = [tri,di].
对这个问题有什么想法吗?

对于 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]

注意我添加了一个转换到 any//1。字符串表示的基本原理是documented here.

使用您的原始代码和查询:

?- set_prolog_flag(double_quotes, codes).
true.

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