Пример программы с переданным параметром, исходным фактом и итерационной задачей для выполнения.Итерация осуществляется с помощью рекурсии.Перед каждым повторным входом значение, связанное с определенным параметром, может быть эффективно обновлено для следующего прохода.
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.
B:
См. my _ loop пример:
В my_loop задача подсчета [1..10] решается итеративно.В качестве параметра передается значение: 1, главным образом потому, что программа делает то же самое снова и снова:
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.