Учебное пособие: Язык логического программирования Visual Prolog
book(title, pages)
written_by(author, title)
long_novel (title)
clauses
written_by(fleming, "DR NO").
written_by(melville, "MOBY DICK").
book("MOBY DICK", 250).
book("DR NO", 310).
long_novel (Title) :-
written_by(_, Title),
book(Title, Length),
Length > 300.
Рис. 1. Листинг программы ch04e01.pro
Пытаясь выполнить целевое утверждение written_by(X, Y), VisualProlog должен проверить каждое предложение written_by(X, Y) в программе. Сопоставляя аргументы X и Yс аргументами каждого предложения written_by, VisualProlog выполняет поиск от начала программы до ее конца. Обнаружив предложение, соответствующее целевому утверждению, VisualProlog присваивает значения свободным переменным таким образом, что целевое утверждение и предложение становятся идентичными. Говорят, что целевое утверждение унифицируется с предложением. Такая операция сопоставления называется унификацией.
Поскольку X и Yявляются свободными переменными в целевом утверждении, а свободная переменная может быть унифицирована с любым другим аргументом (и даже с другой свободной переменной), то целевое утверждение может быть унифицировано с первым предложением written_by в программе, как показано ниже:
written_by (X,Y).
¯¯
written_by(fleming,"DR NO").
VisualProlog устанавливает соответствие, X становится связанным с fleming, aY – “drno”. В этот момент VisualProlog напечатает:
X=fleming, Y="DR NO"
Поскольку TestGoal ищет все решения для заданной цели, целевое утверждение также будет унифицировано и со вторым предложением written_by:
written_by(melville, "MOBY DICK").
TestGoal печатает второе решение:
X=melville, Y="MOBY DICK"
2 Solutions
Рассмотрим, как VisualProlog выполнит следующее целевое утверждение:
long_novel(X).
Когда VisualProlog пытается выполнить целевое утверждение, он проверяет, действительно ли обращение может соответствовать факту или заголовку правила. В нашем случае устанавливается соответствие с
long_novel(Title)