确定。那是我的问题。我需要实现一个谓词,它总结了列表中产品的所有价格。但是,就目前而言,我没有进一步了解它。 我究竟做错了什么? 提前谢谢。
domains
state = reduced ; normal
database
producte (string, integer, state)
predicates
nondeterm calculate(integer)
clauses
% ---> producte( description , price , state )
producte("Enciam",2,normal).
producte("Llet",1,reduced).
producte("Formatge",5,normal).
calculate(Import):-
producte(_,Import,_).
calculate(Import):-
producte(_,Import,_),
calculate(Import2),
Import=Import2+Import,!.
Goal
calculate(I).
答案 0 :(得分:1)
免责声明:说到prolog,我有点愚蠢。此外,我现在无法访问prolog翻译。
规范示例,列表的总和:
sum([], 0).
sum([Head | Tail], Total) :- sum(Tail, Temp), Total is Head + Temp.
使用findall / 3创建一个列表:
findall(Val, producte(_, Val, _), Vals).
Vals有你想要的总和。
更新:根据你的评论,如果没有翻译,我有点超出我的深度。
calculate(I) :- sum(Vals, I), findall(Val, producte(_, Val, _), Vals).
我认为这样做:
使用您的单个目标I
,它接收由您的所有Vals列表汇总的结果。但是,自从我使用prolog以来,我甚至没有正确的语法来做我想要的事情。但是,一个小变化应该可以通过一个目标实现您想要的目标。
答案 1 :(得分:0)
findall部分:
calculate(Price) :-
List = [ Price || producte(_, Price, _) ],
sum_list(List, 0, Sum).
sum_list部分:
sum_list([], Acc, Acc).
sum_list([Head|Tail], Acc, Sum) :-
NewAcc is Acc + Head,
sum_list(Tail, NewAcc, Sum).
我想这些内容应该根据visual-prolog doc工作,但我有点不想安装visual-prolog来测试它......