Prolog DCG从文件中读取separotr

时间:2012-12-15 18:38:44

标签: prolog readfile comma dcg

我在Prolog中迈出了第一步,但我遇到了一个问题。

我正在尝试从用逗号分隔的文件记录中读取

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
upto_comma(Atom) --> string(Codes), ",", !,{ atom_codes(Atom, Codes) }.

但没有改变。

我认为我误解了一些基本概念,任何人都可以提供帮助吗? 我正在使用SWIProlog

2 个答案:

答案 0 :(得分: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 :(得分:1)

有趣;我没有从你展示的代码中得到那个结果;我只是无法解析输入。

首先,考虑一下string规则所承认的内容。它能识别任何字符串吗?或者只是没有逗号的字符串?

然后考虑list_w如何终止。什么代码处理输入中最终“表”的情况?它不能是upto_comma,因为这需要“table”后面跟一个逗号。并且list_w没有任何不包含upto_comma的右侧。