Пролог - небольшое упражнение на факты - PullRequest
0 голосов
/ 05 января 2012

Хорошо.Это моя проблема.Мне нужно реализовать предикат, который суммирует все цены продуктов в списке.Но пока я не буду дальше с этим.Что я делаю неправильно?Заранее спасибо.

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 ]

1 голос
/ 05 января 2012

Отказ от ответственности: я немного глуп, когда дело доходит до пролога.Кроме того, сейчас у меня нет доступа к интерпретатору пролога.

Канонический пример, сумма списка:

sum([], 0).
sum([Head | Tail], Total) :- sum(Tail, Temp), Total is Head + Temp.

создание списка с помощью findall / 3:

findall(Val, producte(_, Val, _), Vals).

У Вальса есть ваш список, который вы хотите суммировать.

Обновление: согласно вашему комментарию, я немного не в себе без доступа к переводчику.

calculate(I) :- sum(Vals, I), findall(Val, producte(_, Val, _), Vals).

Что я думаю, что это делает:

использует вашу единственную цель I, которая получает результат суммирования вашего списка Vals, который генерируется findall.Но прошло так много времени с тех пор, как я использовал пролог, поэтому у меня может даже не быть синтаксиса для выполнения того, что я хочу.Тем не менее, небольшое изменение должно достичь того, что вы хотите с одной целью.

0 голосов
/ 05 января 2012

Часть поиска:

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, но я не хочу устанавливать визуальный prolog, чтобы проверить это ...

...