Операторы сравнения и проверки на равенство различных типов

Рассмотрим, при каких условиях два терма рассматриваются как равные. До сих пор были представлены три типа операторов проверки на равенство, применяемых в

Глава 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

К этому же типу относятся все встроенные предикаты @<, @=<, @>, (а>=, назначе­ние которых очевидно.