Программирование на языке Пролог для искусственного интеллекта

6ec30db9

Различные виды равенства



7. 3.    Различные виды равенства

В каких случаях мы считаем, что два терма равны? До сих пор мы рассматривали три вида равенства в Прологе. Первый был связан с сопоставлением и записывался так:

        Х = Y

Это равенство верно, если Х и Y сопоставимы. Следующий вид равенства записывался в виде

        Х  is  E

Такое равенство выполняется, если Х сопоставим со значением арифметического выражения E. Мы также рассматривали равенства вида

        Е1 =:= Е2

которые верны, если равны значения арифметических выражений  Е1  и  Е2.   Наоборот, если значения двух арифметических выражений не равны, мы пишем

        Е1 =/= Е2

Иногда нам может понадобиться более строгий вид равенства - буквальное равенство двух термов. Этот вид реализован еще одним встроенным предикатом, записываемым как инфиксный оператор '==':

        Т1 == Т2

Это равенство выполняется, если термы   Т1    и   Т2   идентичны, т. е. имеют в точности одинаковую структуру, причем все соответствующие компоненты совпадают. В частности, должны совпадать и имена переменных. Отношение "не идентичны", дополнительное к данному, записывается так:



        Tl \== T2

Приведем несколько примеров:

        ?-  f( a, b) == f( а, b).
        yes

        ?-  f( a, b) == f( a, X).
        nо

        ?-  f( a, X) == f( a, Y).
        no

        ?-  X \== Y.
        yes

        ?-  t( X, f( a, Y) ) == t( X, f( a, Y) ).
        yes

Давайте в качестве примера переопределим отношение

        счетчик( Терм, Список, N)

из разд. 7.1. Пусть на этот раз N будет числом буквальных вхождений Терм'а в Список:

        счетчик( _, [ ], 0).

        счетчик( Терм, [Голова | L], N) :-
                Терм == Голова,  !,
                счетчик( Терм, L, N1),
                N is N1 + 1;
                счетчик( Терм, L, N).



Содержание раздела