В задачах, где идет работа со словарем, полезно иметь предикат для сравнения слов в соответствии с алфавитным порядком. Рассмотрим предикат, который мы назовем 'меньше'. Если предикат 'меньше'(X,Y) используется в качестве целевого утверждения, то он истинен (т.е. согласуется с БЗ), если X и Y обозначают атомы, X по алфавиту предшествует Y. Так, предикат 'меньше'('арбуз','букварь') истинен, а 'меньше'('ветер','автомобиль') ложен. Точно так же должен быть ложен и предикат 'меньше'('картина','картина'). Сравнивая два слова, мы сравниваем их последовательно, буква за буквой и при сравнении каждой буквы определяем, какое из следующих условий имеет место.
Достигнут конец первого слова, но не достигнут конец второго слова. Это имеет место, например, в случае 'меньше'('пар','паровоз'). При возникновении такой ситуации предикат 'меньше' должен считаться истинным (т.е. согласованным с базой знаний).
Очередная литера в первом слове предшествует в алфавите соответствующей литере во втором слове. Например, 'меньше'('слово','слон'). Буква "в" в слове 'слово' предшествует в алфавите букве "н" в слове 'слон'. В этом случае предикат 'меньше' истинен.
Литера в первом слове совпадает с соответствующей литерой во втором слове. В этом случае следует использовать предикат 'меньше' для сравнения оставшихся литер в обоих словах. Например, если дано 'меньше' ('облако','одеяло'), то так как оба аргумента начинаются с буквы "о", необходимо взять в качестве следующей цели 'меньше'('блако','деяло').
.Одновременно достигнут конец первого и второго слов, как, например, в случае 'меньше'('яблоко','яблоко'). При возникновении такого условия предикат 'меньше' должен быть ложным, так как оба слова являются одинаковыми.
Обработаны все литеры второго слова, но еще остались литеры в первом слове, как, например, в случае 'меньше'('алфавитный','алфавит'). В такой ситуации предикат 'меньше' должен быть ложным.
После того как сформулированы перечисленные условия, задача перевода их на Пролог является довольно простой. Будем представлять слова в виде списков кодов символов. Для этого необходим встроенный предикат преобразования атома в терм-строку name(X,Y).
Первым утверждением в определении предиката 'меньше' является следующее правило:
'меньше'(X,Y):-name(X,L),name(Y,M),'меньше 1'(L,M).
Это правило сначала преобразует слова в списки, используя предикат name, и затем с помощью предиката 'меньше 1' сравнивает списки на соответствие алфавиту. Определение предиката 'меньше 1' состоит из утверждений, реализующих приведенный набор условий. Первое условие является истинным, когда первый аргумент есть пустой список, а второй аргумент - это произвольный не пустой список. Два последних условия описывают ситуации, когда предикат ложен, т.е. не согласуется с базой данных, так что если мы не предусмотрим никаких соответствующих им фактов или правил, то при используемом механизме поиска в БЗ доказательство согласованности любого целевого утверждения, для которого эти условия справедливы, закончится неудачей. Собирая все правила вместе, получаем:
'меньше'(X,Y):-name(X,Y),name(Y,M),'меньше 1'(L,M).
'меньше 1'([X|_],[Y|_]):-X
'меньше 1'([H|Q],[H|G]):-'меньше 1'(Q,G).
?-'меньше'('студент','служащий'). ?-'меньше'('инженер','студент').
no yes
?-'меньше'('дом','домовой').
yes
|