Пример программы с переданным параметром, начальным фактом и итеративной задачей для выполнения. Итерация осуществляется посредством рекурсии. Перед каждым повторным запуском значение, соответствующее определенному параметру, может быть эффективно обновлено для следующего прохода.
my_loop(N) :- N > 10.
my_loop(N) :- N =< 10,
write(N), nl,
Nextin is N + 1,
my_loop(Nextin).
:- my_loop(1).
A:
Данная информация (факты) нужны Программы. Они могут быть доступны с клавиатуры, как исходные аргументы для некоторого предиката, или как факты в базе данных, как вы предлагали . Кроме того, только для особых ситуаций, факты могут быть жестко закодированы в некоторый предикат или правило.
Ниже приведен пример передачи исходной информации в качестве параметров: :- my_predicate(args...)
.
Если есть много фактов, база данных лучше. Несколько фактов о том, что нужно менять каждый раз, лучше всего получить с клавиатуры. В противном случае это, вероятно, не имеет значения.
:- my_predicate([fill(j1,0),fill(j2,5)], Answer),
write(Answer),
nl.
В:
Смотрите мой _ петли пример:
В my_loop, задача подсчета [1..10] решается итеративно. Givens: 1 передается как параметр, главным образом потому, что программа выполняет одно и то же: over-and-over:
1. возьмите номер (N); если он слишком велик. В противном случае ...
2. распечатать его.
3. вычислить следующее число (N + 1)
4. повтор
10 жестко закодирован. Это могло бы быть фактом: stop_after(10)
.
Теперь данные можно манипулировать, переменная N в my_loop и {j1, j2} в myPredicate фактически не должны быть повторно назначены над- и-снова: См my_loop. Просто повторно ввести вычисления, когда пришло время, чтобы сделать то же самое вещи снова, но с разными параметрами:
cap(j1,2).
cap(j2,5).
my_predicate(Status, Answer) :-
got_juice(Status,0),
Answer=Status.
%%% Instead of changing values, rerun comp. with new values
%%% based on a computation made from the old ones.
my_predicate([filled(j1,J1), filled(j2,J2)], Answer) :-
Used is J1 + J2,
got_juice(Used, J), J \= 0,
cap(j1,C1), cap(C2),
%% Use cap and filled to add more to filled..
NextJ1 is J1 + ...,
NextJ2 is J2 + ...,
my_predicate(filled(j1,NextJ1), filled(..., Answer).
Примечание:
Предиката выше, чтобы продемонстрировать итерации в Прологе, используя параметры " myProgaram». Для реальной реализации см. Программу, предложенную в комментарии от matcheek.
* «... и у меня ** есть **, чтобы написать программу ...» * - Это домашнее задание? – thkala 2010-12-16 18:16:22
Я не понимаю, в чем именно проблема. Можете ли вы дать мне полное описание проблемы, полученной из университета, я думаю? Не зная, в чем тут проблема, я не могу дать вам ответа, но ... здесь я нашел очень похожую проблему с вашим ответом, уже полученным http://www.informatik.uni-freiburg.de/~ki/ преподавание/ws0708/logic/prolog7.pdf, слайд 17-й и далее – matcheek 2010-12-17 03:14:58