Автор: Пользователь скрыл имя, 01 Октября 2013 в 18:17, курсовая работа
Метапрограммирование — вид программирования, связанный с созданием программ, которые порождают другие программы как результат своей работы (в частности, на стадии компиляции их исходного кода), либо программ, которые меняют себя во время выполнения (самомодифицирующийся код).
В данной работе показано, как можно создать метаинтерпретаторы Prolog — интерпретаторы языка Prolog на самом языке Prolog. Здесь рассматривается специальный метод компиляции программ, называемый обобщением на основе объяснения, который был разработан как один из подходов к машинному обучению. Кроме того, описаны простые интерпретаторы для двух других подходов к программированию: объектно-ориентированное программирование и программиро- вание, управляемое шаблонами.
р v Y и -р v z
где р — высказывание, a Y и Z — формулы исчисления высказываний. В таком случае этап резолюции, выполненный над этими двумя предложениями, приводит к получению третьего предложения:
Y v2
Можно показать, что это предложение логически следует из двух первоначальных предложений. Поэтому, добавив выражение !Y v Z) к рассматриваемой формуле, мы не изменим истинность этой формулы. Таким образом, в процессе резолюции вырабатываются новые предложения. Если же в конечном итоге будет получено "пустое предложение" (которое обычно обозначается как "nil"), это означает, что обнаружено противоречие. Пустое предложение n i l формируется из двух предложений, имеющих следующую форму:
X И ~Х
Эта форма, безусловно, свидетельствует о противоречии.
На рис. 6.1 показан процесс резолюции, который начинается с ввода отрицания предполагаемой теоремы и оканчивается пустым предложением.
Рис. 6.1. Доказательство теоремы (a => Ь) i (Ъ => с) => (а "> с) по методу резолюции. Верхняя строка пред- ставляет собой отрицание данной теоремы в форме ис- числения высказываний. Пустое предложение о пижнеп части свидетельствует о том, что отрицание этой тео
ремы приводит к противоречию
В листинге 6.1 показано, как можно реализовать этот процесс. Эта программа оперирует с предложениями, внесенными в базу данных. Весь ход осуществления принципа резолюции может быть сформулирован в виде процесса, управляемого шаблонами, как показано ниже.
Листинг 6.1, Управляемая шаблонами простая программа для доказательства теорем с помощью метода резолюции
После оформления соответствующей конструкции на языке, управляемом шаблонами, получим следующее правило:
Это правило требует небольшой доработки в целях предотвращения возможности повторного выполнения действий над некоторыми предложениями, что может привести к созданию новых копий уже существующих предложений. Программа, приве- денная в листинге 6,1, регистрирует в базе данных операции, которые уже были выполнены, вводя в нее такой факт:
done( Cl, С2, Р)
В таком случае условные части правил позволяют распознавать и предотвращать подобные повторяющиеся действия.
Правила, приведенные в листинге 6.1, позволяют также учесть некоторые частные случаи, для которых могло бы иначе потребоваться явное представление пустого предложения. Кроме того, имеются два правила, которые упрощают предложения при любой возможности. Одно из этих правил распознает истинные предложения, такие как
a v b v -а
и удаляет их из базы данных, поскольку они не могут применяться для обнаружения противоречия. Еще одно правило удаляет избыточные подвыражения. Например, это правило позволяет упростить следующее предложение:
av Ь v a
преобразовав его в предложение a v b.
Остается нерешенным вопрос о том, как преобразовать заданную формулу исчисления высказываний в форму представления в виде предложений. Эта задача является несложной, и ее выполняет программа, приведенная в листинге 6.2. Процедура translate( Formula} преобразует формулу в множество предложений Cl, C2 и т.д. и вводит эти предложения в базу данных, как показано ниже.
clause I CD .
clause! C2).
Листинг 6.2. Программа
преобразования формулы исчисления
высказываний в множество пред
Теперь программа автоматического доказательства теорем, управляемая шаблонами, может быть вызвана на выполнение с помощью цели run. Итак, чтобы доказать предполагаемую теорему с помощью этих программ, необходимо преобразовать отрицание этой теоремы в форму представления в виде предложений и приступить к выполнению процесса резолюции. Применительно к теореме, рассматриваемой в качестве примера, это можно выполнить с помощью следующего вопроса:
?- translate! -( (a=>b) S (b=>c)=>U=>O) >, run.
Программа в ответ сообщит " Contradiction found" (Обнаружено противоречие), а это означает, что первоначальная формула является теоремой.
ЗАКЛЮЧЕНИЕ
СПИСОК ЛИТЕРАТУРЫ