Программирование на языке Пролог для искусственного интеллекта
Шрифт:
(a)
(b)
(c)
5.2. Следующие отношения распределяют числа на три класса - положительные, нуль и отрицательные:
Сделайте эту процедуру более эффективной при помощи отсечений.
5.3. Определите процедуру
которая разбивает список чисел на два списка: список, содержащий положительные числа (и нуль), и список отрицательных чисел. Например,
Предложите две версии: одну с отсечением, другую — без.
5.3. Отрицание как неуспех
"Мэри любит всех животных, кроме змей". Как выразить это на Прологе? Одну часть этого утверждения выразить легко: "Мэри любит всякого X, если X — животное". На Прологе это записывается так:
Но нужно исключить змей. Это можно сделать, использовав другую формулировку:
Если X — змея, то "Мэри любит X" — не есть истина,
иначе, если X — животное, то Мэри любит X.
Сказать на Прологе, что что-то не есть истина, можно при помощи специальной цели
Здесь первое правило позаботится о змеях: если X — змея, то отсечение предотвратит перебор (исключая таким образом второе правило из рассмотрения), а
Ту же идею можно использовать для определения отношения
которое выполняется, если X и Y не совпадают. При этом, однако, мы должны быть точными, потому что "различны" можно понимать по-разному:
• X и Y не совпадают буквально;
• X и Y не сопоставимы;
• значения арифметических выражений X и Y не равны.
Давайте считать в данном случае, что X и Y различны, если они не сопоставимы. Вот способ выразить это на Прологе:
Если X и Y сопоставимы, то
цель
иначе цель
Мы снова используем сочетание отсечения и
То же самое можно записать и в виде одного предложения:
Здесь
Эти примеры показывают, что полезно иметь унарный предикат "not" (не),
такой, чтоистинна, если Цель не истинна. Определим теперь отношение not следующим образом:
Если
иначе
Это определение может быть записано на Прологе так:
Начиная с этого момента мы будем предполагать, что
можно записывать и как
Многие версии Пролога поддерживают такую запись. Если же приходится иметь дело с версией, в которой нет встроенного оператора
Следует заметить, что
Тем не менее
Это, конечно, выглядит лучше, нежели наши прежние формулировки. Вид предложений стал более естественным, и программу стало легче читать.
Нашу программу теннисной классификации из предыдущего раздела можно переписать с использованием
В качестве еще одного примера использования