2016-01-30 38 views
1

我想要使用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].
任何想法此PROBL他们吗?

+0

的问题是,你是在混淆你的程序使用的数据类型不同。代码列表,字符列表,字符串,原子....这是Prolog的常见陷阱之一,因为您不必以任何方式声明类型。另外,你正在做的这个'pre - > any'和'member'事情就是我所说的“代码味道”。 –

+0

你在展示完整的课程吗?您使用的是什么Prolog实现?什么版本?你有没有设置一些全球性的旗帜? –

+0

在这个程序中'pre - > any'具有所有列表元素都是字符串或原子。主要问题是查询输入是String,String被拆分为'Ls = [tri,di] .'或'Ls = [“tri “,”di“]。”我正在使用SWI-Prolog版本7.1.17 – Gamsh

回答

1

为SWI-Prolog的第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] 
+0

,是的,它的工作是谢谢你。 – Gamsh