Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект по ЯП_Гайденрайх.doc
Скачиваний:
23
Добавлен:
16.03.2015
Размер:
533.5 Кб
Скачать

Язык программирования лисп

Программы и данные в Лисп – сущности, строящиеся по одинаковым правилам. Что открывает интересные возможности.

Язык Лисп является наиболее популярным языком при создании искусственного интеллекта, потому что ориентирован на обработку символьных данных. На лиспе можно осуществлять вычисления, но можно просто обработать символьные данные.

S - выражение – каждое выражение представляет собой либо атом либо список.

Атом - простейший элемент программы или данных на языке Лисп – цепочка алфавитно-цифровых символов без пробелов или специальных знаков.

Список – нечто, заключенное в круглые скобки. В частности ((Король ФЕРЗЬ)(ЛАДЬЯ)(СЛОН))Пешка)

Видим интересную вещь, что элементами списка могут быть разнородные данные, в том числе вложенные подсписки и может быть несколько уровней вложенности.

Некоторые предварительно определенные атомы являются функциями, аргументы которых записываются (<имя функции><арг1> <арг2> <арг3). В Лисп (f_x_y_z). Чтобы х воспринимался как аргумент, а не функция, то перед именем ставится знак апостроф – означает что не следует пытаться вычислить значение аргумента, а следует воспринять как атом.

(SETQ <атом> <S-выражение>) - наклеиваем метку на S-выражение и можно обращать к нему по короткому имени. Можно сказать, что это аналог присваивания? На самом деле нет. В чистом функциональном программировании отсутствует разрушающее присваивание, которое позволяет переменной присвоить одно значение, затем другое, с потерей предыдущего. Здесь этого нет. Просто наклеили этикетку на объект. На этот объект может наклеить еще этикетку.

Наиважнейшей для Лиспа функцией является функция CAR, возвращающая первый элемент, CDR возвращает хвост списка.

(CAR '(A B C)) -> A. Кар от АБС это будет элемент А.

(CDR ‘(A B C)) -> B C. Даст список В С

(CAR ‘((A) B)) -> A получим список из одного элемента А.

(CARA) – так нельзя. Нельзя взять первый элемент от атома. Ошибка.

CDR ‘((A)B) -> (B)

Если взять CDR от атома CDRA-> () называется NIL. Пустой список.

Выполняет функцию логического значения ложь.

Можно комбинировать CAR и CDR.

CAR (CDRA B C) -> B

Откуда взялись CAR и CDR? Первая реализация была на IBM 7094, там были команды ассемблера CAR и CDR. (CADR S)==( CAR (CDR S)) (CADDR S) == (CAR (CDR (CDR S))) (CADDAR S)=== (CAR (CDR (CDR (CAR S))))

Функция конструирования списка (CONS ‘A ‘(B C))-> (A B C) (CONS ‘A NIL)->(A) (CONS (CAR S) (CDR S))-> S

Отличием списков на лиспе от списков на Си – в лиспе тоже ссылочная структура в списке, и каждый элемент списка содержит указатель на хвост списка, однако в Си у нас элементы списка были одного типа, а здесь у нас каждый элемент представляет собой ссылку в памяти на произвольную структуру данных.

В языке ЛИСП любая программа сама по себе является s-выражением. Это свойство языка ЛИСП позволяет создавать программы, которые перестраивают сами себя.

EVAL – для вычисления выражения (SETQ AB) – A станет именем для В (SETQ BC) – B станет именем для С (EVAL A)->C (CDR ‘(A (BC)))-> ((BC)) (CAR ‘(CDR (A B C))) -> CDR (ATOMA) -> T (ATOM NIL)->T (ATOMCAR)->T (ATOM ‘(A B)) ->NIL (NULL (CDRA)) -> T (EQUAL ‘(A B) (A B))->T (AND …) (OR …) (NOT …) AND – затем аргументы которые вычисляются слева направо.

Если при этом значение хотя бы одного будет НИЛ то AND вернет НИЛ. Если ни одно то AND вернет последнее выражение.

OR – идут выражения которые вычисляются и если хотя бы одно будет отлично от НИЛ то первое значение будет возвращено как значение всего выражения.

NOT – если значение выражения равно NIL то вернется Т, в противном случае вернется NIL.

COND (<p1> <s1>) (<p2> <s2>)

Если значение выражение p1 отличается от NIL, то в качестве значения всей функции COND вернется s1, если значение p2 отличается от NIL, то в качествеве значения вернется s2 и т.д.

Если все p1 будут иметь значения NIL то NIL будет иметь все выражение.

(+ 1 2 3 4 5)->15 (- 5 2)->3 (* 10 2)->20 (/ 40 8)->5 (MAX 5 8 7 6)-> 8 (MIN 5 8 7 6)->5 (< N1 N2) (> N1 N2) (REM N1 N2) – остаток деления N1 на N2 (ZEROP N1) ->T если N1=0

JOY – язык.