Prolog DCG 使用 separotr 从文件中读取
Posted
技术标签:
【中文标题】Prolog DCG 使用 separotr 从文件中读取【英文标题】:Prolog DCG read from file with separotr 【发布时间】:2012-12-15 18:38:43 【问题描述】:我正在 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
【问题讨论】:
【参考方案1】:您的语法错过了 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.
【讨论】:
【参考方案2】:有趣;我没有从您显示的代码中得到该结果;我只是无法解析输入。
首先,想想你的string
规则识别什么。它可以识别任何字符串吗?还是只有不带逗号的字符串?
然后想想 list_w 是如何终止的。什么代码处理输入中最终“表”的情况?它不能是 upto_comma,因为这要求“table”后面跟一个逗号。并且 list_w 没有任何不包含 upto_comma 的右手边。
【讨论】:
以上是关于Prolog DCG 使用 separotr 从文件中读取的主要内容,如果未能解决你的问题,请参考以下文章