Prolog - 使用 DCG 解析

标签 prolog dcg

我想编写一个 DCG 来处理记事本中显示的文本。 我已经阅读了一些关于编写 DCG 的在线教程,但没有一个是免费的,涉及字符串、日期和整数的文本。我不太确定如何开始编写 DCG(如何表示一行甚至日期)。 有帮助吗?

最佳答案

“诀窍”是以声明的方式解决问题,首先给出更具选择性的模式。您的数据格式具有明显定义明确的柱状结构,并且可以处理使用库(dcg/basics):

:- [library(dcg/basics)].

row([Date,Key|Numerics]) -->
 date(Date), separe, key(Key), separe, numeric_pairs(Numerics).

date(D/M/Y) -->
 integer(D), "/", integer(M), "/", integer(Y).

key([F|Ks]) -->
 [F], {F \= 0' }, string(Ks).

numeric_pairs([Num:Perc|NPs]) -->
 integer(Num), separe, number(Perc), "%", whites, !, numeric_pairs(NPs).
numeric_pairs([]) --> [].

separe --> white, whites.

测试:

?- atom_codes('02/18/2014  BATS Z  235122734   6.90%   109183482   10.50%  147587409   7.80%', Cs), phrase(row(R), Cs).
Cs = [48, 50, 47, 49, 56, 47, 50, 48, 49|...],
R = [2/18/2014, [66, 65, 84, 83, 32, 90], 235122734:6.9, 109183482:10.5, 147587409:7.8] 

我必须说这不是很容易调试。当 Prolog 回溯时,您没有任何关于出了什么问题的提示......我想应该有一个专门的跟踪......

要提供 DCG,请参阅库(pure_input),或者 - 更易于调试 - 一次获取一行,使用 read_line_to_codes/2

编辑也许我使用 read_line_to_codes/2 的命中是一个错误。

这是对测试数据的完整扫描,使用 phrase_from_file/2 以及随后选择的适当列和总和(根据参数要求的列)。

:- [library(dcg/basics)].
:- [library(pure_input)].

test(ColToSum, Tot) :-
    phrase_from_file(row(Rows), '/tmp/test.txt'),
    maplist(get_col(ColToSum), Rows, Cols),
    sum_list(Cols, Tot).

get_col(ColToSum, Row, Col) :-
    nth1(ColToSum, Row, Col:_).

row([[Date,Key|Numerics]|Rows]) -->
 date(Date), separe, key(Key), separe, numeric_pairs(Numerics), "\n",
 row(Rows).
row(Rows) -->
 string(_), "\n",
 row(Rows).
row([]) --> [].

date(D/M/Y) -->
 integer(D), "/", integer(M), "/", integer(Y).

key([F|Ks]) -->
 [F], {F \= 0' }, string(Ks).

numeric_pairs([Num:Perc|NPs]) -->
 integer(Num), separe, number(Perc), "%", whites, !, numeric_pairs(NPs).
numeric_pairs([]) --> [].

separe --> white, whites.

产生

?- test(3,X).
X = 561877153 

如果您使用的是 Windows,请使用“\r\n”作为行终止符...

HTH

关于Prolog - 使用 DCG 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23266480/

相关文章:

prolog - 退出 SWI Prolog 中的所有错误

algorithm - Frog 和蟾蜍

prolog - current_prolog_flag double_quotes DCG(代码或字符)?

prolog - 为文件输入创建 dcg 的一般模式是什么?

prolog - 在处理列表时, "-"符号在Prolog中是什么意思?

list - 回文(作业)

unit-testing - 在 Prolog 中测试。如何运行单元测试来检查我的输出文件是否与我的文本文件匹配?

prolog - 密码算术难题(Prolog)

prolog - Prolog 中的运算符 `-->` 是做什么的?

Prolog DCG set_prolog_flag double_quotes 源代码指令位置很重要;文件?