Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пролог =).doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.69 Mб
Скачать

7.3 Поиск в лабиринте

Рассмотрим следующую задачу: Существует дом с комнатами b,c,d,e,f,g. Между некоторыми комнатами есть двери. В одной из комнат (g) находится клад. Требуется пройти через комнаты к кладу.

Запишем информацию о дверях:

door(a,b). door(b,c). door(b,e). door(d,e). door(d,c). door(e,g). door(e,f).

Переход из комнаты в комнату производится через предикат:

path(X,Y,T)

  • X - исходная комната;

  • Y - конечная комната;

  • T - список пройденных комнат. Он необходим, чтобы не проходить дважды через одну комнату.

Терминальное условие

path(Y,Y,T)

Т.е. мы находимся в нужной комнате.

Рекурсивное правило перехода:

path(X,Y,T):-door(X,Z),not(member(Z,T)),

path(Z,Y,[Z|T]).

Характер рекурсии другой. Один аргумент всегда увеличивается. В этой программе каждая дверь в одну сторону. Чтобы избежать этого, есть два варианта:

  • добавить к door(b,c) факт door(c,b)

  • ввести еще одно правило:

path(X,Y,T):-door(Z,X),not(member(Z,T)),

path(Z,Y,[Z|T]).

Можно записать, используя

дизъюнкцию

path(X,Y,T):-(door(Z,X);door(X,Z)),

not(member(Z,T)),

path(Z,Y,[Z|T]).

Поиск пути в комнату f

?-path(a,f,[]).

Добавим факт о кладе:

money(g).

Тогда найдем путь к комнате с кладом.

Запрос

?-path(a,X,[]), money(X).

Это вопрос типа "создать и проверить" находит достижимые комнаты, а затем проверяет наличие в них клада.

Запрос

?-money(X),path(a,X,[]).

Здесь требуется сначала найти комнату, а затем путь к ней.

Интересные задачи:

  • Как вывести путь T?

  • Как найти самый короткий путь?

7.4 Сравнительная характеристика языков программирования.

Характеристика

PASCAL

LISP

PROLOG

тип языка

процедурный

функциональный

логический

типы данных

скаляры,структуры

атомы,списки

атомы,структуры

обработка данных

присвоение, передача по значению, передача по ссылке

значение функции, передача по значению

связь переменных через унификацию

управление программой

последовательное, ветвление,циклы рекурсия

вычисление функций, условные вычисления, рекурсии, циклы

рекурсия, бэктрекинг, !

структуры программы

блоки, процедуры

функции, LET-блоки

правила, факты

действия переменных

глобальные, локальные

локальные, свободные, предложение

область, одно

транслятор

компилятор, компилятор

интерпретатор, компилятор

интерпретатор

длина программы

5

3

1

скорость

1

2

5

Область

программы общего назначения

символная обработка, ИИ

ЭС, ИИ, прототипы