- •Данные и знания
- •При обработке на эвм, знания трансформируются алогично данным
- •Существует несколько способов получения слотов значений во
- •Формальные логические модели
- •Лекция №2
- •Вывод на знаниях
- •Стратегия управления выводом
- •Стандартные функции
- •Если мы определяем лисп – функцию
- •Символьные данные
- •Лекция №4 функции в языке лисп
- •Математическая логика в лисПе
- •Параметры
- •Функции для обработки списков
- •Предикаты
- •Лекция №5
- •Построение списков
- •Полный перебор
- •Направление поиска
- •Программирование методов поиска
- •Поиск в глубину, в ширину и по наилучшему варианту
- •Лекция №7 макросы
- •Макрос не вычисляет аргументы
- •Макрос вычисляется дважды
- •Контекст вычисления макроса
- •Пример отличия макроса от макроса
- •Рекурсивные макросы и продолжающиеся вычисления
- •Тестирование макросов
- •Обратная блокировка разрешает промежуточные вычисления
- •Лекция №8
- •Сопоставление с образцом и распознавание образцов
- •Распознавание списочных образцов
- •Условия сопоставимости
- •Использование переменных в образце
- •Сопоставление с переменной образца
- •Лекция № 9
Функции для обработки списков
ЛИСП – главным образом язык списков, а CAR, CDR и CONS являются тремя примитивными функциями отработки списков, из которых получаются все другие функции обработки списков. Все имена функций ЛИСПа произносятся, как если бы это были английские слова. Так CAR – кар, CDR – ка-де-эр.
Функция CAR в качестве аргумента получает список. Её значением является первый элемент этого списка так,
если Х есть (2 6 4 7), то (CAR Х) есть 2;
если Х есть (2 (6 (4 (7)))), то (CAR Х) есть 2;
если Х есть ((2 6) (4 7)), то (CAR Х) есть (2 6);
если Х есть ((((2) 6) 4) 7), то (CAR Х) есть (((2) 6) 4).;
Функция CDR в качестве аргумента также получает список. Её значением является остаток списка после удаления первого элемента. Так,
если Х есть (2 6 4 7), то (CDR Х) есть (6 4 7);
если Х есть (2 (6 (4 (7)))), то (CDR Х) есть ((6 (4 (7)));
если Х есть ((2 6) (4 7)), то (CDR Х) есть ((4 7)),
если Х есть ((((2) 6) 4) 7), то (CDR Х) есть(7).;
Если Х является атомом, то выражение (CAR Х) не имеет смысла и в действительности не определено (и будет причиной ошибки). Если Х – список, содержащий в точности один элемент, то (CDR Х) не имеет смысла по данному выше определению. Однако мы заключим соглашение, что в этом случае (CDR Х) равно специальному атому NIL, который, также используется для обозначения «лжи» (“false”).
Функция CONS собирает вновь то, что CAR и CDR разбили на части. Её значением является список, а её аргументом ( их два) служат результаты CAR и CDR, примененный соответственно к этому списку так,
если Х есть 2 и Y есть (6 4 7) то (CONS X Y) есть (2 6 4 7);
если Х есть 2 и Y есть ((6 (4 (7)))), то (CONS X Y) есть (2 (6 (4 (7))));
если Х есть (2 6) и Y есть (( 4 7)) то (CONS XY) есть ((2 6) (4 7));
если Х есть (((2) 6) 4) и Y есть (7) то (CONS XY) есть ((((2) 6) 4) 7);
Результатом функции CONS, применённой к любым двум аргументам. является следующее. Второй аргумент CONS должен быть списком. Чтобы получить значение CONS присоединим к началу этого списка ещё один элемент, а именно первый аргумент CONS (который может быть чем угодно, включая атом).
Второй элемент любого списка есть первый элемент (CAR L), или, что то же самое, (CDR (CAR L)). Это также может быть записано как (CADR L). Третий элемент списка L является вторым элементом (CDR L), что равно (CADR (CDR L)), или (CAR (CDR (CDR L)). Это также может быть записано как (CADDR L).
В общем случае большинство ЛИСП – систем позволяет пользователю порождать специальные имена функций, записывая букву С, следующие за ней буквы А и D, количество которых не превышает разумных пределов (скажем, 5), и следующую за ними букву R. Каждая буква А в таких выражениях означает CAR, и каждая D означает CDR, а буквы А и D берутся по порядку слева направо. Так,
(CDADDR Y) означало бы (CDR (CAD (CDR (CDR Y)))).
Функция АPPEND соединяет вместе два списка. Так,
если X есть (1 2 3) и Y есть (4 5 6),то (APPEND X Y) есть (1 2 3 4 5 6).
Это иногда называется конкатенацией списков (1 2 3) и (4 5 6). Заметим, что в этом случае (CONS X Y) было бы ((1 2 3 ) 4 5 6).