Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие_по_jason_(итог).doc
Скачиваний:
79
Добавлен:
21.03.2016
Размер:
1.79 Mб
Скачать

Пример №3

!print_fact(5). // выражение №1

+!print_fact(N)

<- !fact(N,F); // выражение №2

.print("Factorial of ", N, " is ", F).

+!fact(N,1): N == 0. // выражение №3

+!fact(N,F): N > 0

<- !fact(N-1,F1); // выражение №4

F = F1 * N.

Изначальная цель данного агента напечатать факториал 5, что формализовано как выражение №1. Изначальная цель активирует первый план, в котором вызывается достижение подцели, помеченной как выражение №2. Эта подцель говорит о том, что прежде чем выводить на печать значение факториала его нужно еще рассчитать. Выражение №3 представляет собой план с пустым телом. Он говорит о том, что когда возникает цель подсчитать факториал 0, то следует считать его равным единице и больше ничего делать не нужно.

Третий план срабатывает, когда требуется подсчитать факториал числа N>0 и говорит о том, что сначала надо достичь подцели, рассчитав факториал N-1 и поместив его значение в переменную F1, а далее следует рассчитать факториал N умножением F1 на N.

Выражение №4 выполняется рекурсивно.

Итак, мы видим, что изначальная цель активирует первый план, который запускает рекурсивные вычисления. Построение стека рекурсивно вычисляемых выражений продолжается в третьем плане, который постепенно уменьшает N, доводя его до нуля. Как только N становится равно 0, срабатывает второй план, начинается выборка элементов стека и накопление значения факториала. Последним выражением в стеке будет печать результата из первого плана.

Эффективность в данном примере достигается за счет работы со стеком целей, что значительно быстрее поиска в базе убеждений, которая представляет собой список.

Пример №4(a)

Приведем примеры на обработку других событий. Напишем программу, которая будет пытаться подсчитать сумму.

a(10).

b(15).

!start.

+!start <- ?a(X);

?b(Y);

?c(Z);

.print("Summa = ",X+Y+Z).

Мы задали 2 начальных убеждения a(10) и b(15) и установили цель «!start». Рассмотрим тело плана, реализующего достижение этой цели. Первые 3 строчки в теле плана – это цели-проверки. Однако для достижения цели «?c(Z)» в базе убеждений нет информации. Нет также никакого другого способа определения значения Z, нет и планов, обрабатывающих подобные ошибки. Поэтому если мы запустим нашу программу, то получим системное сообщение об ошибке.

Пример №4(b)

Модифицируем предыдущий пример и добавим в него правило для определения «с(Z)».

a(10).

b(15).

c(Z):-a(X)&b(Y)&Z=X+Y.

!start.

+!start <- ?a(X);

?b(Y);

?c(Z);

.print("Summa = ",X+Y+Z).

Добавленное правило утверждает, что Z определяется как сумма X и Y. Теперь наша программа заработает и определит сумму, равную 50.

Пример №4(с)

Результат, полученный в предыдущем примере, можно было получить и другим способом. Удалим правило, но добавим план для обработки события «+?с(Z)».

a(10).

b(15).

!start.

+!start <- ?a(X);

?b(Y);

?c(Z);

.print("Summa = ",X+Y+Z).

+?c(Z) <- ?a(X);

?b(Y);

Z=X+Y.

Результат работы программы не изменится.