logo search
ЯП / ЯП / ЯП экзамен

Унификация и хорновский клоз в логических языках программирования.

Одним из наиболее важных аспектов программирования на Прологе является использование унификации (отождествления) и конкретизации переменных. Пролог пытается отождествить термы при доказательстве, или согласовании, целевого утверждения. Например, в программе для согласования запроса ?- человек(Х) целевое утверждение человек(X) может быть отождествлено с фактом служащий(Иван), в результате чего переменная Х станет конкретизированной: Х= Иван. Хорновский клоз (Ноrn clause) — это формула, в которой с помощью конъюнк­ции («и») элементарных формул выводится одиночная элементарная формула:

(s=>t)<=(t = tl||t2)^(s=>tl)

Логическое программирование основано на том наблюдении, что, ограничи­вая формулы хорновскими клозами, мы получаем правильное соотношение между выразительностью и эффективностью вывода. Такие факты, как t => t, являются выводами, которые ниоткуда не следуют, т. е. они всегда истинны. Вывод также называется головой формулы, потому при записи в инверсной форме оно появляется в формуле первым.

Чтобы инициализировать вычисление логической программы, задается цель:

“wor” => "Hello world"?

Машина вывода пытается сопоставить цель и вывод формулы. В данном слу­чае соответствие устанавливается сразу же: "wor" соответствует переменной s, a "Hello world" — переменной t. Это определяет подстановку выражений (в данном случае констант) для переменных; подстановка применяется ко всем переменным в формуле:

"wor" => "Hello world" <= ("Hello world" = tl || t2) ^ ("wor" => tl)

Теперь мы должны показать, что:

("Hello world" = t1|| t2) ^ ("wor" => tl)

является истинным, и это ведет к новому соответствию образцов, а именно попытке установить соответствие "Hello world" с tl || t2. Здесь, конечно, может быть много соответствий, что приведет к поиску. Например, машина вывода может допускать, чтобы tl указывало на "Не", a t2 указывало на "llо world"; эти подстановки затем проводятся во всем вычислении.