3

我正在 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

4

2 回答 2

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.
于 2012-12-15T21:56:36.940 回答
1

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

首先,想想你的string规则认可什么。它可以识别任何字符串吗?还是只有没有逗号的字符串?

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

于 2012-12-15T23:10:51.653 回答