Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Prolog.docx
Скачиваний:
1
Добавлен:
25.12.2018
Размер:
94.2 Кб
Скачать

Управление порядком вычислений

Предикат 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).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]