Опубликован: 26.09.2006 | Доступ: свободный | Студентов: 1772 / 459 | Оценка: 4.25 / 4.12 | Длительность: 17:09:00
ISBN: 978-5-9556-0066-6
Специальности: Программист, Математик
Лекция 14:

Логическое программирование

< Лекция 13 || Лекция 14: 12345

Элементы языка Пролог

Основным элементом языка Пролог является терм. Термы строятся из переменных, атомов, чисел и функторов с использованием круглых скобок.

Переменная — это цепочка (слово), составленная из букв, цифр и символа подчеркивания, начинающаяся с большой буквы или символа подчеркивания. Если переменная используется однажды, то вместо нее можно использовать так называемую анонимную переменную, состоящую из одного символа подчеркивания.

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

Числа записываются традиционным образом. Числа с плавающей запятой в обычных применениях Пролога используются редко из-за ошибок округления.

Функтор синтаксически совпадает с атомом.

Терм — это либо переменная, либо атом, либо число, либо выражение вида

\eq*{
f(t_1, t_2\dts t_k),
}
где fфунктор, а t_1, t_2\dts t_k — термы.

Для некоторых специальных функторов, например знаков арифметических операций, отношений сравнения и других, в Прологе, как в традиционной математике, используется инфиксная форма записи. Например, выражение X +
1 рассматривается как терм с функтором + и двумя аргументами X и 1.

Среди термов ввиду особой важности выделяются термы для представления списков. Канонически список представляется двухместным термом, первым аргументом которого является головной элемент списка, а вторым — его хвост, то есть список, полученный из исходного удалением головного элемента. Функтором в такой записи часто используется символ точка. Альтернативным представлением списка является выражение вида [t_1, t_2\dts t_k] или [t \,|\, L], где t — головной элемент, а L — хвост списка. Допустимо также выражение вида [t_1, t_2\dts t_k \,|\, L].

Важным инструментом в языке Пролог является унификация термов с помощью подстановок. Такую унификацию мы применяли выше в примерах на доказательство методом резолюций. Сейчас более подробно рассмотрим понятие унификации.

Подстановкой называется набор пар \ta = (x_1/t_1, x_2/t_2 \dts x_n/t_n), где x_1, x_2\dts x_n — переменные, а t_1, t_2\dts
t_n — термы.

Через E\ta обозначим результат подстановки термов t_1, t_2\dts t_n в выражение E вместо переменных x_1, x_2\dts x_n.

Пусть \pi = (y_1/u_1, y_2/u_2\dts y_m/u_m) — еще одна подстановка. Композиция \ta \pi двух подстановок \ta и \pi определяется следующим образом:

\eq*{
E(\ta \pi) = (E \ta)\pi.
}
Подстановка \ta \pi может быть вычислена следующим образом. Составим из подстановок \ta и \pi последовательность
\eq*{
(x_1/t_1 \pi, x_2/t_2 \pi \dts x_n/t_n\pi, y_1/u_1, y_2/u_2\dts y_m/u_m)
}
и проведем следующие две операции:

  1. Если некоторое y_i совпадает с некоторым x_j, то вычеркиваем пару y_i/u_i.
  2. Если t_i \pi = x_i, то вычеркиваем пару x_i/t_i \pi.

Пример. Пусть \ta = (x/f(y), y/z),\ \pi = (x/a, y/b, z/y). Рассмотрим последовательность

\eq*{
(x/f(y) \pi, y/z \pi, x/a, y/b, z/y) = (x/f(b), y/y, x/a, y/b, z/y)
}
и по первому правилу вычеркиваем пары x/a и y/b, затем по второму правилу — пару y/y. В результате получим
\eq*{
\ta \pi = (x/f(b), z/y).
}

Подстановка \ta называется унификатором термов E_1, E_2, если E_1 \ta = E_2 \ta.

Наиболее общим унификатором термов E_1, E_2 называется подстановка \sigma, такая, что любой другой их унификатор \ta представляется в виде \ta = \sigma \pi.

Пример. Для термов P(a, y), P(x, f(b)) унификатором будет подстановка

\eq*{
(x/a, y/f(b)).
}
Будет ли она наиболее общим унификатором?

Пример.

Для термов P(a, x, f (g(y))) и P(z, f(z), f(u)) наиболее общим унификатором будет подстановка (z/a, x/f(a), u/g(y)). Результатом унификации будет терм P(a, f(a), f(g(y)))

< Лекция 13 || Лекция 14: 12345
Антон Сиротинкин
Антон Сиротинкин

на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно...