2016-01-30 41 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