Рассмотрим, при каких условиях два терма рассматриваются как равные. До сих пор были представлены три типа операторов проверки на равенство, применяемых в
Глава 7. Дополнительные встроенные предикаты 159
языке Prolog. Первый из них основан на согласовании и записывается следующим '
образом:
х = i
Он принимает истинное значение, если X и Y согласуются. Еще один тип оператора проверки на равенство записывается таким образом: X is E
Он принимает истинное значение, если X соответствует значению арифметического выражения Е. Кроме того, рассматривался следующий оператор: Е1 =:= Е2
Он принимает истинное значение, если равны значения арифметических выражений Е1 и Е2. В отличие от этого, если значения двух арифметических выражений проверяются на неравенство, можно применить следующий оператор: El - \= E2
Иногда в программе необходимо применить более строгий тип проверки на равенство: буквальное равенство, или идентичность двух термов. Такая проверка на равенство осуществляется с использованием еще одного встроенного предиката, который записывается как инфиксный оператор "==": Т1 — Т2
Он принимает истинное значение, если термы Т1 и Т2 идентичны; иными словами, они имеют полностью одинаковую структуру и все их соответствующие компо- J ненты являются одинаковыми. В частности, должны быть также одинаковыми имена переменных. Обратным по смыслу отношением является отношение проверки на неидентичность, которое записывается следующим образом:
Tl\== T2
Ниже приведены некоторые примеры применения операторов проверки на идентичность и неидентичность.
?- f (a, b) == t < a, b).
yes
?- f(a, b) == f(a, X).
ЙО
?- f (a, X) — f { a, Y).
По
?- X \== Y.
yes
?- t< X, f[a,YM == t(X, f{a,Yl).
yes
В качестве примера переопределим отношение count; Terra, List, N)
рассматриваемое в разделе 7.1. Предположим, что в данном случае N представляет собой количество буквальных вхождений терма Term в список List:
count L, 11, 0).
count i Term, [Head L ], K):-
Term — Head,!,
count (Term, L, N1),
N is Bit 1
count (Terra, L, КЗ.
В этой книге уже рассматривались предикаты, предназначенные для сравнения арифметических значений термов, например X - 2 < 5. Еще один набор встроенных предикатов позволяет сравнивать лексикографические значения термов и поэтому определять на термах отношения упорядочения. Например, цель
х @< у
Часть I. Язык Prolog
расшифровывается таким образом: терм X предшествует терму Y. Отношение предшествования между простыми термами определяется путем алфавитного или цифрового упорядочения. Отношение предшествования между структурами определяется как предшествование их главных функторов. А если главные функторы равны, то решение принимается на основе определения отношений предшествования между самыми верхними, самыми левыми функторами в субтермах переменных X и Y. Соответствующие примеры приведены ниже.
?- paul @< peter. yes
?- f(2)<Kfо;.
yes
1- g{2)!<f(3>.
no
7- g(2) @>= f(3).
yes
? - f! A, g(b), c) @< f t a, h(a),a).
yes
К этому же типу относятся все встроенные предикаты @<, @=<, @>, (а>=, назначение которых очевидно.