Cтраница 2
Первый аргумент предиката choice может содержать пустой список переменных. В этом случае каждая переменная, обозначенная во втором аргументе, может получить только одно значение. [16]
Задаем начальные условия: L - пустой список, все ребра не маркированы. [17]
Заметьте, что оператор EMPTY помещает пустой список nil на вершину стека. [18]
Задаем начальные условия: L - пустой список, все ребра не маркированы. [19]
Мы начинаем с узлаR и инициализируем L как пустой список. Затем добавляем узел R в список, переходим к единственно возможному узлу А, и его также добавляем к списку L, получая L [ R A. [20]
Если вершина находится в состоянии вне или имеет пустой список СР-после-дователей, то не делать ничего. В противном случае для каждой вершины в списке СР-последователей проверить на действительность ее СР-подтверждения и если среди них будут найдены действительные, то получить их текущие эквивалентные SL-подтверждения и подтвердить данную вершину полученным подтверждением. Если это подтверждение окажется новым и вызовет поддержание истинности ( шаги с первого по пятый), то вновь начать шаг 6; в противном случае вернуться. [21]
Определение этой функции приводит нас к удобному представлению пустого списка. [22]
В свою очередь NULL больше подходит для проверки на пустой список. [23]
Мы начинаем с узла R и инициализируем L как пустой список. Узел S не имеет исходящих ребер, следовательно, это тупик, который заставляет нас вернуться к узлу А. [24]
В этом утверждении мы заменяем второй аргумент атомом, который представляет пустой список. [25]
Первая аксиома утверждает, что конкатенация ( т.е. приписывание спереди) пустого списка с другим списком не меняет второго списка. [26]
Причиной возникновения ошибки служит принятое в Лисп-системе соглашение, что головой пустого списка является NIL, а это приводит к тому, что как ( CAR NIL), так и ( CAR ( NIL. В чистом Лиспе значение формы ( CAR NIL) не определено, поскольку NIL - атом. Если бы функция MEMBER2 была определена так, как это сделано у нас, то вызов функции выдавал бы ошибочный результат во всех случаях, когда искомый элемент не входит в список. Если бы ветви EQL и NULL были расположены в том же порядке, как в MEMBER1, то функция работала бы правильно, поскольку ранее проверяемое условие ( NULL L) исключало бы возможность применения CAR к пустому списку. [27]
Почему процедура для предиката подсписок / 2 дублирует ответы, имеющие вид пустого списка, в том случае, когда вторым аргументом вызова является переменная. [28]
Заметим, что если исходный список пуст, то результатом сортировки также будет пустой список. Реализация быстрой сортировки на Прологе показана на рис. 9.2. Здесь в качестве элемента X, удаляемого из списка, всегда выбирается просто голова этого списка. [29]
Первое правило программы print list ( [ ]) описывает тот факт, что пустой список не нужно печатать, оно же является условием выхода из рекурсии, используемым во втором правиле - печать списка завершается тогда, когда список пуст. [30]