Prolog 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

您的语法错过了 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.

有趣;我没有从您显示的代码中得到该结果;我只是无法解析输入。

首先,考虑一下您的string规则识别的内容。 它是否识别任何字符串?还是只有没有逗号的字符串?

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

最新更新