Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ФЛП.doc
Скачиваний:
14
Добавлен:
24.09.2019
Размер:
478.72 Кб
Скачать

Унификация составных объектов

    Составной объект может быть унифицирован с простой переменной или с составным объектом (возможно, содержащим переменные в качестве частей во внутренней структуре), который ему соответствует. Это означает, что составной объект можно использовать для того, чтобы передавать целый набор значений как единый объект, и затем применять унификацию для их разделения. Например:

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]