在序言中用匹配列表拆分字符串
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]
我想使用 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]