首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog -用DCG解析

Prolog -用DCG解析
EN

Stack Overflow用户
提问于 2014-04-24 10:37:24
回答 1查看 1.2K关注 0票数 3

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-24 12:11:33

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

代码语言:javascript
复制
:- [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.

测试:

代码语言:javascript
复制
?- 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),或者--更容易调试--使用电码/2及时获取一行。

编辑也许我的点击使用read_line_ to _code/2是不好的。

下面是测试数据的完整扫描,使用文件/2,并随后选择合适的列和和(按参数要求的列)。

代码语言:javascript
复制
:- [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.

会产生

代码语言:javascript
复制
?- test(3,X).
X = 561877153 

如果您正在使用Windows,请使用"\r\n“作为行终止符.

HTH

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23266480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档