Программирование на языке ПРОЛОГ для искуственного интеллекта

       

Формирование термов


Предположим, наша программа имеет дело с семьями, которые представлены в виде термов так, как это сделано в гл. 4 (рис. 4.1). Тогда, если, перемен-

line();

        родители
                том фокс, датарожд 7 май 1950, работает bbс,
                                                                        оклад 15200
                энн фокс, датарожд 9 май 1951, неработает
        дети
                пат фокс, датарожд 5 май 1973, неработает
                джим фокс, датарожд 5 май 1973, неработает

line();

Рис. 6. 2.  Улучшенный формат вывода термов, представляющих семью.

ная F конкретизирована термом, изображенный на рис. 4.1, то цель

        write( F)

вызовет вывод этого терма в стандартной форме примерно так:

        семья( членсемьи( том, фокс, дата( 7, май,1950),
                         работает( bbс, 15200)),
                членсемьи( энн, фокс, дата( 9, май, 1951),
                         неработает),


                [членсемьи( пат, фокс, дата( 5, май, 1973),
                         неработает),
                членсемьи( джим, фокс, дата( 5, май, 1973),
                         неработает)])


Здесь содержится полная информация, однако форма представления легко может запутать, поскольку трудно проследить, какие ее части образуют самостоятельные семантические единицы. Поэтому обычно предпочитают выводить такую информацию в каком-либо формате, например так, как показано на рис. 6.2. Процедура

        вывсемью( F)

с помощью которой это достигается, приведена на рис. 6.3.

line();         вывсемью( семья ( Муж, Жена, Дети) :-
                nl, write( родители), nl, nl,
                вывчленсемьи( Муж), nl,
                вывчленсемьи( Жена), nl, nl,
                write( дети), nl, nl,
                вывчленсемьи( Дети).


        вывчленсемьи( членсемьи( Имя, Фамилия, дата( Д, М, Г), Работа) ) :-
                tab(4), write( Имя),
                tab(1), write( Фамилия),


                write( ', дата рождения'),
                write( Д), tab( 1),
                write( M), tab( 1),
                write( Г), write( ','),
                вывработу( Работа).


        вывсписчлсемьи( [ ]).

        вывсписчлсемьи( [Р | L]) :-
                вывчленсемьи( Р), nl,
                вывсписчлсемьи( L),
        вывработу( неработает) :-
                write( неработает).


        вывработу( работает Место, Оклад) ) :-
                write(' работает '), write( Место),
                write( ', оклад '), write( Оклад).


line(); Рис. 6. 3.  Программа, обеспечивающая вывод в формате, представленном на рис. 6.2.


Содержание раздела