- •Вопрос 1) Сравнительная характеристика декларативных и процедурных языков программирования
- •Вопрос 2) Предикаты. Предложения: факты и правила. (Prolog)
- •Вопрос 3) Переменные. Анонимные переменные. Конкретизация переменных Prolog
- •Унификация составных объектов
- •Использование знака равенства для унификации составных объектов
- •Унификация.
- •Сравнение термов.
- •Вопрос 4) Сопоставление и унификация. Предикат равенства. (Prolog)
- •Вопрос 5) Основные секции программы Prolog
- •Вопрос 6) Основные стандартные домены (Prolog)
- •Вопрос 7) Основные принципы поиска с возвратом. (Prolog)
- •Вопрос 8) Управление поиском решений(Prolog)
- •Вопрос 9) Простые и составные объекты данных
- •Унификация составных объектов
- •Использование знака равенства для унификации составных объектов
- •Использование нескольких значений как единого целого
- •Пример использования составных объектов
- •Вопрос 10) Аргументы множественных доменов. (Prolog )
- •Аргументы множественных типов
- •Вопрос 11) Рекурсия (Prolog)
- •Cхема вычисления факториала с помощью нисходящей стратегии рекурсии
- •12. Списки: объявление и примеры работы. (Prolog)
- •13. Строки. Работа со строками. (Prolog)
- •Вопрос 14) Метод отката после неудачи Prolog
- •Вопрос 15) Основы языка lisp. Символьные выражения: атомы и списки. (Lisp)
- •Вопрос 16) Базовые функции и предикаты. (Lisp)
- •Вопрос 17) Функции, определение функций.
- •Вопрос 18) простая рекурсия. (Lisp)
Унификация составных объектов
Составной объект может быть унифицирован с простой переменной или с составным объектом (возможно, содержащим переменные в качестве частей во внутренней структуре), который ему соответствует. Это означает, что составной объект можно использовать для того, чтобы передавать целый набор значений как единый объект, и затем применять унификацию для их разделения. Например:
date("April",14,1960)
сопоставляется с X и присваивает X значение date("April ",14, 1960). Также
date("April",14,1960)
сопоставляется с date(Mo,Da,Yr) и присваивает переменным Mo="April", Da=14 и Yr = 1960.
Использование знака равенства для унификации составных объектов
Пролог осуществляет унификацию в двух случаях. Во-первых, когда цель сопоставляется с заголовком предложений. Во-вторых, через знак равенства (=), который является инфиксным предикатом (предикатом, который расположен между своими аргументами, а не перед ними).
Фактически, Пролог выполняет операцию присваивания для унификации объектов по разные стороны знака равенства. Это свойство полезно для нахождения значений аргументов составного объекта. Например, программа pro35_1.pro проверяет, совпадают ли фамилии у двух людей, и затем дает второму человеку тот же адрес, что и у первого.
domains
person=person(name,address)
name=name(first,last)
address=addr(street,city,state)
street=street(number,street_name)
city,state,street_name=string
first,last=string
number=integer
goal
P1=person(name(jim,mos), addr(street(5,"1st st"), igo, "CA")),
P1=person(name(_,mos), Address),
P2=person(name(jane,mos), Address),
write("P1=",P1) ,nl,
write("P2=",P2),nl.
Унификация.
Предикат =/2 в чистом виде выражает важнейшую концепцию Пролога - унификацию или сопоставление термов. При унификации основных термов, они просто сравниваются на тождественность и в зависимости от результата возвращается ответ "да" или "нет".
?- 1 = 1.
Yes
?- a(1) = b(1).
No
Если термы содержат переменные, делается попытка присвоить значения переменным, так, чтобы оба терма стали идентичными. Если такое означивание переменных возможно, унификация успешна и значения переменных выдаются в качестве ответа.
?- X = 1.
X = 1
Yes
?- 2+3 = X.
X = 2+3
Yes
Как видно переменные могут находиться как слева, так и справа от знака '='.
?- X = 1, X = 1.
X = 1
Yes
?- X = 1, X = 2.
No
В первом примере переменная X сначала сопоставляется с 1 и получает значение 1, затем это значение успешно сопоставляется с 1 (1 = 1). Во втором примере X получает значение 1, которое затем сопоставляется с 2 (то есть фактически делается попытка унификации 2 = 1), что, конечно, завершается неудачей.
Возможно одновременное означивание нескольких переменных.
?- f(X,Y,Z) = f(a,b,g(c)).
X = a
Y = b
Z = g(c)
Yes
?- X+2 = 3+Y.
X = 3
Y = 2
Yes
Любая переменная сопоставляется сама с собой и не получает при этом никакого значения.
?- X = X.
X = _G160
Yes
Сопоставление двух различных переменных всегда успешно.
?- X = Y.
X = _G160
Y = _G160
Yes
Никаких значений переменные при этом не получают, но между ними устанавливается связь, таким образом, что в дальнейшем они будут выступать в качестве синонимов. Обратите внимание, что "значение" у X и Y одно и то же. Такие переменные называют сцепленными (не связанными, потому что "связанная переменная" означает то же что "конкретизированная" или "означенная" переменная, то есть "переменная, получившая значение").
?- X = Y, Y = Z, Z = a.
X = a
Y = a
Z = a
Yes
Здесь X связывается с Y, Y связывается с Z и, наконец, Z получает значение 'a'. После этого все три переменные имеют одно и то же значение 'a'.
Обязательно поэкспериментируйте с унификацией разных термов - это ключ к пониманию Пролога. Важность унификации состоит в том, что посредством её происходит передача аргументов и возврат значений из процедур. Пусть, например, программа состоит из одного предложения.
unify(X, X).
Отношение unify, определяемое этой программой ничем не отличается от '='.
?- unify( f(1,X), f(Y,2)).
X = 2
Y = 1
Yes
В действительности, предикат = обычно именно так и определяется .
X = X.
Это просто означает, что механизм унификации встроен глубоко в недра Пролога.
Встроенный предикат \= сопоставляет два терма и успешен только в том случае если унификация невозможна.
?- X \= a.
No