0

好的。那是我的问题。我需要实现一个谓词来总结列表中产品的所有价格。但是,就目前而言,我没有进一步了解它。我究竟做错了什么?提前致谢。

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). 
4

2 回答 2

1

免责声明:关于序言,我有点愚蠢。另外,我现在无法使用 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 列表求和的结果,该列表由 findall 生成。但是自从我使用 prolog 以来已经很久了,我什至可能没有正确的语法来做我想做的事。但是,一个小的变化应该可以通过一个目标完成您想要的。

于 2012-01-05T17:50:29.080 回答
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来测试它......

于 2012-01-05T17:51:37.327 回答