Prolog DCG 使用 separotr 从文件中读取

标签 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.

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

相关文章:

prolog - 在 Prolog DCG 中使用列表

prolog - 序言中的语法错误

exception - 确保谓词确定性地成功

list - 在 Prolog 中展平列表

prolog - Prolog DCG语法规则中的堆栈溢出:如何有效或延迟地处理大型列表

prolog - 我可以在 call/2 中添加参数列表吗?

Prolog notBetween 函数

list - Prolog回文

prolog - 在 Prolog 中处理用户输入到 "phrase/3"方法

prolog - 涉及大括号的语法