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

Математическая логика в лисПе

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

Четыре основные части описания функции приведены ранее. Первая часть в ЛИСПе содержит имя специальной функции DEFUN, а вторая состоит из имени функции. Введем новую «функцию» с двумя аргументами, которая будет выполнять роль третьей и четвертой части. В действительности третьей части соответствует ее первый аргумент, а четвертой части – второй.

Новая «функция» называется LAMBDA. Так выражение

(LAMBDA (A B) (- (* A A) (* B B))),

встретившееся в определении функции, означает, что эта функция с аргументами А и В в указанном порядке представляет собой А2 - В2 . В общем случае первым аргументом LAMBDA служит список аргументов функций, а вторым, - S- выражение, которое использует указанные аргументы.

«Значением» обращения к LAMBDA является само описание функции. В частности, это может быть применено везде, где может быть использовано имя функции. Если мы зададим на ЛИСПе входную строку

((LAMBDA (A B) (- (* A A) (* B B))) 6 3),

то результатом работы ЛИСП – системы будет число 27 (что равно 62 – 32) как и обычно, были взяты два S – выражения. Второе из них является списком аргументов 6 3 , в то время как первое, не имя функции, LAMBDA - выражение.

LAMBDA – конструкция имеет давнюю историю в математической логике. Она была введена Черчем, который написал о ней книгу («Исчисление Lambda –преобразований», 1941). В форме записи Черча LAMBDA, используемая выше, имеет вид XY (x2 – y2), который необходимо строго отличать от YX (x2 – y2).

Теперь мы готовы определить некоторые простые функции в ЛИСПе. Рассмотрим входную строку (на самом высшем уровне)

(DEFUN P (X) (*X X))

Она описывает единственную функцию, заданную списком их двух элементов. Первым из этих элементов является Р – имя функции. Второй элемент (X) (*XX) – служит описанием функции. Это описание указывает что данная функция имеет один аргумент, потому что имеется только один атом, а именно X в списке, который является первым аргументом LAMBDA. Это значит, что обращение к Р должно иметь в точности один аргумент. После этой входной строки мы могли бы написать, например:

(Р 7)

Параметры

В процедурных языках существует понятие формальнных параметрах в отличное от него понятие фактических параметров. Если мы напишем procedure p(x, y, h), то X, Y, H – это формальные параметры. Если мы затем используем функцию Р в выражении, таком как А – B*P(C-D,E/F,G), то C-D, E/F и G являются фактическими параметрами.

Это понятие взаимно однозначного соответствия между формальными параметрами и фактическими параметрами в математической логике имеет специальный термин – увязывание (binding). Можно было бы сказать, что в данном случае X связывается с C – D, Y- связывается с E/F, Y- связывается с G.

В ЛИСпе – такого рода связи возникают еще в одном случае. Так, если мы используем S – выражение

((LAMBDA (X Y) (- (* X X) (* Y Y))) 4 3),

то Х связывается с 4, а Y связывается с 3. Результатом является f (4, 3), где f (x,y)=x2-y2, что равно 16-9, или 7.

Приведенное выше LAMBDA – выражение, так же как LAMBDA - выражения в примере предыдущего пункта, имеет то свойство что каждая переменная, которая встречается во втором аргументе LAMBDA является связанной переменной. Не требуется, чтобы так было всегда, есть и свободные переменные.