Prolog - 对事实的一点练习

时间:2012-01-05 17:29:38

标签: database prolog fact visual-prolog

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

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

2 个答案:

答案 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来测试它......