Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog-parse与DCG_Prolog_Dcg - Fatal编程技术网

Prolog-parse与DCG

Prolog-parse与DCG,prolog,dcg,Prolog,Dcg,我想写一个DCG,可以处理记事本中显示的文本。 我读过一些关于编写DCG的在线教程,但没有一本是免费的,包含字符串、日期和整数的。我甚至不知道如何开始编写DCG(如何表示一行或甚至一个日期)。 有什么帮助吗?诀窍是以声明的方式处理问题,首先给出更多的选择模式。您的数据格式显然有一个定义良好的列结构,使用库(dcg/basics)可以处理: :- [library(dcg/basics)]. row([Date,Key|Numerics]) --> date(Date), separe,

我想写一个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.
测试:

我必须说这不太容易调试。当Prolog回溯时,您对出错的地方没有任何提示。。。我想应该有专门的线索

要为DCG提供数据,请参阅库(纯输入),或者-更易于调试-使用/2随时获取一行

编辑也许我的点击使用读取行代码/2是一个坏的

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

这就产生了

?- test(3,X).
X = 561877153 
如果您使用的是Windows,请使用“\r\n”作为行终止符


HTH

尝试从SWI Prolog查看此库中的代码:我将其保存在csv中,但我想在从csv提取数据之前检查DCG。我希望DCG解析每一行,然后我可以提取我需要的数据列。例如,如果我想对Column磁带A的所有值求和
:- [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