- •Первое знакомство Объекты и отношения
- •Запросы
- •Переменные
- •Конъюнкция
- •Правила
- •Более подробно Термы
- •Операторы
- •Эквивалентность и унификация
- •Арифметика
- •Выполнение целей (повторение)
- •Структуры и деревья
- •Обработка списков
- •Отсечение
- •Разное Ввод-вывод
- •Управление порядком вычислений
- •Динамическое создание и анализ структур
- •Пролог как база данных
- •Работа с файлами
Управление порядком вычислений
Предикат repeat, не имеющий аргументов, выполняется бесконечное количество раз. Вместе с отсечением его можно использовать для организации циклов. Пример:
?- repeat, read(stop), !. |: a. |: abc. |: stop. true.
Предикат true выполняется всегда (но только один раз). Предикат false не выполняется никогда. Предикат false также можно использовать для организации циклов. Пример:
?- member(X, [a, b, c]), write(X), nl, fail. a b c false.
Унарный предикат \+ представляет собой отрицание (вернее «отрицание как невыполнение»); он выполняется тогда и только тогда, когда его аргумент, будучи сам интерпретирован как запрос, не выполняется. Пример:
?- \+ a = b. true.
?- \+ a = a. false.
?- \+ X = a. false.
Унарный предикат call выполняет свой аргумент так, как если бы этот аргумент сам являлся запросом.
?- call(write('ABC')). ABC true.
?- call((X = 'ABC', write(X))). ABC X = 'ABC'.
?- Z = write('ABC'), call(Z). ABC Z = write('ABC').
Динамическое создание и анализ структур
Тернарный предикат functor унифицирует функтор первого аргумент со вторым аргументом, а количество компонентов первого аргумента с третьим аргументом. Тернарный предикат arg унифицирует компонент второго аргумента с третьим аргументом; номер унифицируемого компонента задается первым аргументом. Наконец, предикат =.. унифицирует функтор первого аргумента с первым элементом списка представленного вторым аргументом, а компоненты первого аргумента — с хвостом этого списка. Примеры:
?- functor(f(a, b), X, N). X = f, N = 2.
?- functor(Z, f, 2). Z = f(_G382, _G383).
?- arg(1, f(a, b), X). X = a.
?- arg(N, f(a, b), a). N = 1 ; false.
?- arg(N, f(a, b), X). N = 1, X = a ; N = 2, X = b.
?- functor(Z, f, 2), arg(1, Z, a), arg(2, Z, b). Z = f(a, b).
?- f(a, b) =.. L. L = [f, a, b].
?- Z =.. [f, a, b]. Z = f(a, b).
Пролог как база данных
Пролог позволяет динамически добавлять и удалять предложения (факты и правила). Для добавления предложения используются унарные предикаты asserta и assertz; разница между ними в том, что первый добавляет предложение в начало базы данных, а второй — в конец. Предикаты asserta и assertz выполняются всегда. Для удаления предложения используется унарный предикат retract; он удаляется из базы первое предложение, унифицируемое с аргументом. Если в базе данных нет правила, унифицируемого с аргументом, предикат retract не удовлетворяется. Перед динамическим добавлением в базу данных предикат должен быть объявлен как динамический с использованием унарного предиката dynamic. Пример (внимание! этот пример надо набирать подряд):
?- dynamic happy / 1. true.
?- assertz(happy(mary)). true.
?- assertz(happy(alice)). true.
?- asserta(happy(jane)). true.
?- assertz(happy(john) :- happy(mary)). true.
?- happy(X). X = jane ; X = mary ; X = alice ; X = john.
?- retract(happy(alice)). true.
?- happy(X). X = jane ; X = mary ; X = john.
?- retract(happy(X)), !. X = jane.
?- happy(X). X = mary ; X = john.
?- retract(happy(john) :- X). X = happy(mary).
?- happy(X). X = mary.
?- assertz(happy(bill)). true.
?- retract(happy(bill) :- X). X = true.
При использовании предиката retract необходимо помнить, что с точки зрения Пролога факт happy(mary) всего лишь сокращенная форма записи правила happy(mary) :- true. Для перечисления всех предложений можно использовать бинарный предикат clause (этот предикат не имеет побочных эффектов). Пример:
?- assertz(happy(mary)). true.
?- assertz(happy(john) :- happy(mary)). true.
?- clause(happy(X), Y). X = mary, Y = true ; X = john, Y = happy(mary).