我正在 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.
关于Prolog DCG 使用 separotr 从文件中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13895020/