Поисковая машина: примеры работа Пролог-машины

 

Как работать с Пролог-машиной

Для работы с Пролог-машиной можно использовать консольный отладчик Проекта - утилиту syntax. Запускаем, вводим команду #pa - она переводит отладчик в режим прямого доступа к Пролог-автомату.

 

Классика жанра - демонстрация средств логического вывода

Для языка Пролог есть аналог программы, печатающей "Hello, world!". Этот пример показывает, как работает inference engine - средство логического вывода, ядро Пролог-машины.

Итак, вводим два факта: Сократ - человек, и Платон - человек.

Теперь эти два факта (два предиката) сохранены в глобальной базе знаний. Можно сделать запрос к базе:

В данном примере X - имя переменной запроса. Inference engine при доказательстве теоремы human(X) пытается подобрать все факты из базы знаний, которые обращают теорему в истину. Подбор значений свободных переменных называется подстановкой или конкретизацией (instantiation).

Теперь введем в базу знаний более сложный предикат. Вербально он означает, что некто является смертным в том случае, если он - человек.

Символ :- это логическая импликация (если-то).

Последний запрос mortal(X)? как раз демонстрирует логический вывод - мы не сообщали в явном виде, что Сократ и Платон смертны, но система на основе имеющихся фактов и логических цепочек вывела это самостоятельно.

 

Генерация всех вариантов доказательства

Одной из самых непривычных для неопытного программиста особенностью Пролога является отсутствие в нем на первый взгляд специальных конструкций для условий и циклов.  Если Вы имеете опыт работы с языком SQL, то знаете, что доступ к базе данных вполне возможен без явного написания циклов. Аналогичным образом работает Пролог-машина. Она организует цикл сама в случае, если результаты исполнения запроса требуют этого.

Рассмотрим простой пример - генерацию всех двухзначных сочетаний из символов 0 и 1. Для выполнения этой работы в процедурном языке потребовалось бы написать два вложенных цикла. В Прологе поступают иначе.

Во-первых, в базу знаний вносим два факта:

digit(0).

digit(1).

Эти факты можно проинтерпретировать, к примеру, как вектор digit, содержащий два элемента.

Далее, формулируем правило:

group(X,Y) :- digit(X), digit(Y).

Остается только сделать запрос:

group(A,B)?

Пролог-машина начнет попытки сделать запрос истинным, подбирая имеющиеся у него факты и другие правила. Результат в данном случае таков:

  © Mental Computing 2010