2012-01-05 6 views
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). 
+0

Что вы пытаетесь сделать? В PROLOG вам нужно указать вещи, которые являются истинными. Линия «producte» («Enciam», 2, normal) ». говорит, что это правда, что Enciam, с ценой 2 и нормальным статусом, является продуктом. Строка «вычислить (импорт): - producte (_, Import, _)». говорит, что Импорт удовлетворяет вычислению, если есть продукт с ценой Импорт. Это не имеет большого смысла. Если вам нужен пример вычисления суммы вещей в списке, я буду рад предоставить один ... – Patrick87

+0

Большое вам спасибо. Но если это должно быть с «фактами/базами данных»? – mkll

ответ

1

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

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

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, который получает результат суммирования списка, который Вальс генерируется FindAll. Но это было так давно, что я использовал пролог, который, возможно, даже не имеет синтаксиса для того, чтобы делать то, что я хочу. Однако небольшая вариация должна выполнить то, что вы хотите, с одной целью.

+0

Я благодарен за помощь. Я просто могу передать один параметр в «цели»: я (как общая цена для получения). – mkll

+0

@mkll - Если мое обновление не помогает, мы надеемся, что ответа Мога будет достаточно (хорошо выглядит для меня). Я не могу программировать пробные ошибки, чтобы исправить свой ответ без доступа к интерпретатору. – ccoakley

+0

Спасибо, много человек. Я решил проблему !!! – mkll

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

Я думаю, что-то вдоль этих линий должны работать в соответствии с визуально-пролог документ, но я вроде не хочу установить визуально- пролог, чтобы проверить его ...

+0

Я потерялся в этой проблеме. Как вы думаете, для реализации этого предиката нам нужно передать 2 параметра? calculate (List, Sum) Список и целое число. – mkll

+0

Я отредактировал, теперь должен соответствовать визуальным прологам. – m09

+0

Большое спасибо. Я решил проблему! – mkll