【发布时间】:2014-04-28 07:21:31
【问题描述】:
我是 Prolog 的新手,作为一项学校作业,我需要在 Prolog 中编写一个 DCG,然后编写一个谓词来确定某些内容。输入是一个字符串,如下所示:
Date,Exchange,Tape A,Tape A %,Tape B,Tape B %,Tape C,Tape C %,Total,Total %,Tape A Moving,Tape A % Moving,Tape B Moving,Tape B % Moving,Tape C Moving,Tape C % Moving,Total Moving, Total % Moving
02/18/2014,NASDAQ,473515614,13.80%,119199766,11.40%,520888794,27.50%,1113604174,17.50%,511929756,14.30%,145320601,12.30%,532617511,26.30%,1189867868,17.50%
02/18/2014,NYSE,721710805,21.10%,0,0.00%,0,0.00%,721710805,11.40%,707472219,19.70%,0,0.00%,0,0.00%,707472219,10.40%
第一行是标题。
我编写了 DCG 解析器:
row([[Date,Stock,A,PerA,B,PerB,C,PerC,Total,PerTotal,A2,A3,B2,B3,C2,C3,T2,T3,'\n']|Rows]) -->
date(Date), separe,stock(Stock),
integer(A),separe,number(PerA),"%",separe,
integer(B),separe,number(PerB),"%",separe,
integer(C),separe,number(PerC),"%",separe,
integer(Total),separe,number(PerTotal),"%",separe,
integer(A2),separe,number(A3),"%",separe,
integer(B2),separe,number(B3),"%",separe,
integer(C2),separe,number(C3),"%",separe,
integer(T2),separe,number(T3),"%",separe,
row(Rows).
row(Rows) -->
string(_),"\n" ,
row(Rows).
row([]) --> [].
date(D/M/Y) -->
integer(D), "/", integer(M), "/", integer(Y).
stock([F|Ks]) -->
[F], {F \= 0' }, string(Ks).
separe --> white, whites.
它工作正常,但在我解析输入后,我需要找到具有最大 Total 的元素。 我虽然想做这样的事情:
findMaxTotal([],X,Ret).
findMaxTotal([R1|Rest],X,Ret):-
nth1(9,R1,X),
findMaxTotal(Rest,Y,max(Ret,X)).
但它不起作用,我无法在 SWI prolog 中真正调试它以了解原因。
有人对如何在列表列表中找到最大值有任何提示吗?
谢谢!
【问题讨论】:
-
在 SWI-Prolog 中,您可以简单地使用
max_list(List, Max)。