2012-12-15 51 views
3

我正在Prolog中完成第一步,但遇到了問題。Prolog DCG從separotr中讀取文件

我試圖從逗號

upto_comma(Codes) --> string(Codes), ",", !. 
list_w([W|Ws]) --> upto_comma(W), [W] ,list_w(Ws). 
string([]) --> []. 
string([H|T]) -->[H],string(T). 

分隔的文件記錄讀,但我的一切是與單個字符的列表,而我想要的是元素的列表。例如從

cat,dog,table 

我想[cat,dog,table]和我[c,a,t,d,o,g,t,a,b,l,e]

我曾嘗試在

upto_comma(Atom) --> string(Codes), ",", !,{ atom_codes(Atom, Codes) }. 

改變upto_comma,但什麼都沒有改變。

我覺得有一些我誤解的基本概念,有人可以幫忙嗎? 我正在使用SWIProlog

回答

3

你的語法遺漏了list_w // 1的基本情況,我不明白爲什麼在upto_comma(W)之後你只需要讀取同樣的東西。

我會寫這樣

list_w([W|Ws]) --> string(W), ",", !, list_w(Ws). 
list_w([W]) --> string(W). 

string([]) --> []. 
string([H|T]) -->[H],string(T). 

測試:

?- phrase(list_w(S),"cat,dog"). 
S = [[99, 97, 116], [100, 111, 103]] ; 
false. 
1

有趣的;我沒有從你顯示的代碼中得到這個結果;我只是無法解析輸入。

首先,考慮一下你的string規則認識到什麼。它識別任何字符串嗎?或者只有沒有逗號的字符串?

然後想一想list_w是如何終止的。什麼代碼處理輸入中最終「表」的情況?它不能upto_comma,因爲那需要在「table」之後加一個逗號。而list_w沒有任何不包含upto_comma的右側。