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

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

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

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

X = Y

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

X is E

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

Е1 =:= Е2

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

Е1 =/= Е2

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

Т1 == Т2

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

T1 == T2

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

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

?- 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).
 

Оглавление книги


Генерация: 1.218. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз