победил( том, джон).

        победил( энн, том).

        победил( пат, джим).

Мы хотим определить

        отношение класс( Игрок, Категория)

которое распределяет игроков по категориям. У нас будет три категории:

    победитель - любой игрок, победивший во всех сыгранных им играх

    боец - любой игрок, в некоторых играх победивший, а в некоторых проигравший

    спортсмен - любой игрок, проигравший во всех сыгранных им партиях

Например, если в нашем распоряжении есть лишь приведенные выше результаты, то ясно, что Энн и Пат - победители. Том - боец и Джим - спортсмен.

Легко сформулировать правило для бойца:

    Х - боец, если существует некоторый Y, такой, что Х победил

        Y, и

        существует некоторый Z, такой, что Z победил

        X.

Теперь правило для победителя:

    Х - победитель, если

        X победил некоторого Y и

        Х не был побежден никем.

Эта формулировка содержит отрицание 'не', которое нельзя впрямую выразить при помощи тех возможностей Пролога, которыми мы располагаем к настоящему моменту. Поэтому оказывается, что формулировка отношения победитель должна быть более хитрой. Та же проблема возникает и при формулировке правил для отношения спортсмен. Эту проблему можно обойти, объединив определения отношений победитель и боец и использовав связку 'иначе'. Вот такая формулировка:

        Если Х победил кого-либо и Х был кем-то

                     побежден,

        то Х - боец,

        иначе,    если Х победил кого-либо,

                       то Х - победитель,

                       иначе,     если Х был кем-то побежден,

                                      то Х - спортсмен.

Такую формулировку можно сразу перевести на Пролог. Взаимные исключения трех альтернативных категорий выражаются при помощи отсечений:

        класс( X, боец) :-

             победил( X, _ ),

             победил( _, X),  !.

        класс( X, победитель) :-

             победил( X, _ ),  !.

        класс( X, спортсмен) :-

             победил( _, X).

Заметьте, что использование отсечения в предложении для категории победитель не обязательно, что связано с особенностями наших трех классов.

Упражнения

5. 1.    Пусть есть программа:

        р( 1).

        р( 2) :-  !.

Вы читаете Prolog
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату