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 从文件中读取的主要内容,如果未能解决你的问题,请参考以下文章

Prolog DCG中的可选项或重复项

通过 DCG 在 Prolog 中的镜头,可能与否?

Prolog DCG从字母数字字符构建/识别单词串

如何在DCG之后从知识库中生成一些短语?

如何在没有 DCG 的 L 系统启发的重写系统中进行递归

如何找出 Prolog 是不是执行尾调用优化