Основы логического программирования на языке ПРОЛОГ (продолжение)
Объекты данных
Структуры Структурные объекты (или просто структуры) - это объекты, которые состоят из нескольких компонент. Эти компоненты, в свою очередь, могут быть структурами. 1983)
Структуры Например, дата(14, октябрь, 2009) Это структура, состоящая из трех компонент: день, месяц, год. В данном примере все компоненты являются константами.
Структуры Компоненты могут быть переменными. Например, дата(Х, октябрь, 2009)
Структуры Все структурные объекты можно изображать в виде деревьев. Корнем дерева служит предикат, ветвями, выходящими из него - компоненты. Если некоторая компонента тоже является структурой, тогда ей соответствует поддерево в дереве, изображающем весь структурный объект.
Пример объекта «книга»
Описание структуры на Turbo-Prolog = (,..., )
Пример описание структуры domains предмет = книга(автор, название) автор = автор(фамилия, имя, отчество, дата_рождения) дата_рождения = дата_рождения(год, месяц, день) название, фамилия, имя, отчество = string год, месяц, день = integer студент = string
Пример описание структуры predicates владелец(студент, предмет) clauses владелец(Петрова, книга(автор(Пушкин, Александр, Сергеевич, дата_рождения(1799, 6, 6)), Сказки)).
domains предмет = книга(автор, название) автор = автор(фамилия, имя, отчество, дата_рождения) дата_рождения = дата_рождения(год, месяц, день) название, фамилия, имя,отчество = string год, месяц, день = integer студент = string
domains предмет = книга(автор, название) автор = автор(фамилия, имя, отчество, дата_рождения) дата_рождения = дата_рождения(год, месяц, день) название, фамилия, имя,отчество = string год, месяц, день = integer студент = string predicates владелец(студент, предмет) clauses владелец(Петрова, книга(автор(Пушкин, Александр, Сергеевич, дата_рождения(1799, 6, 6)), Сказки)).
Семантические модели Пролога Семантические модели нужны для объяснения смысла программы. В Прологе применяются две семантические модели: декларативная и процедурная.
В декларативной модели рассматриваются отношения, определенные в программе. Для этой модели порядок следования предложений в программе и условий в правиле не важен.
Процедурная модель рассматривает правила как последовательность шагов, которые необходимо успешно выполнить для того, чтобы соблюдалось отношение, приведенное в заголовке правила.
Множество предложений, имеющих в заголовке предикат с одним и тем же именем и одинаковым количеством аргументов, трактуются как процедура. Для процедурной модели важен порядок, в котором записаны предложения и условия в предложениях.
Определить максимум из двух чисел max(X,Y,X):-X>Y. /* если первое число больше второго, то первое число - максимум */ max(X,Y,Y):-X<Y. /* если первое число меньше второго, то второе число - максимум */ max(X,Y,Y):X=Y. /* если первое число равно второму, возьмем в качестве максимума второе число */
Определить максимум из двух чисел max(X,Y,X):-X>Y. /* если первое число больше второго, то первое число - максимум */ max(X,Y,Y):-X<=Y. /* если первое число меньше или равно второму, то второе число - максимум */
Отсечение Отсечение (cut) на Прологе обозначается восклицательным знаком "!". Этот предикат предназначен для ограничения пространства поиска, с целью повышения эффективности работы программ. Он всегда завершается успешно.
Определить максимум из двух чисел max2(X,Y,X):-X>Y,!./* если первое число больше второго, то первое число - максимум */ max2(_,Y,Y). /* в противном случае максимумом будет второе число */