Материал: Терёхин В. В. Turbo Prolog

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

collection(_,Book(Volume,_)).

Будет ли выдан список всех авторов и книг ? Если нет, еще раз проверьте правильность написания утверждений.

3.3.7 Использование альтернативных доменов

Представление данных часто требует наличия большого числа структур. В Турбо-Прологе эти структуры должны быть описаны. Более того, возникают трудности с предикатами, работающими с объектами этих доменов. Для устранения данного недостатка Турбо-Пролог предлагает пользователю альтернативные описания доменов. Программа "Предметы" (листинг 3.9) как раз и использует эти альтернативные описания:

_____________________________________________________________

Листинг 3.9

/* Программа: Предметы */ /* Назначение: Демонстрация использования конструкций */

/*

альтернативных доменов.

*/

domains

thing = misc_thing(whatever)

;

 

 

book(author, title)

;

 

record(artist, album, type) person, whatever,

author, title,

artist, album, type = symbol

predicates

owns(person, thing)

clauses

/* факты */ /* Разнообразные вещи */

owns("Bill", misc_thing("sail boat")). owns("Bill", misc_thing("sports car")). owns("Jack", misc_thing("Motor cycle")). owns("Jack",

misc_thing("house trailer")). owns("Beth", misc_thing("Chevy wagon")).

owns("Beth", misc_thing("Piano")). owns("Linda", misc_thing("motor boat")).

/* книги */ owns("Bill",

book("J.R.R. Tolkein", "Return of the Ring")).

owns("Bill",

book("James A. Mishener", "Space")). owns("Jack", book("Manuel Puig",

61

"Kiss of the Spider Woman")). owns("Beth", book("Frank Herbert", "Dune")).

owns("Beth",

book("Tom Clancy",

"The Hunt for Red October")). owns("Linda", book("Garrison Keillor",

"Lake Wobegon Days")). /* грампластинки */

owns("Bill", record("Elton John", "Ice Fair", "popular")).

owns("Bill",

record("Michael Jackson - Lionel Richie", "We are the World",

"popular")). owns("Jack",

record("Bruce Springsteen", "Born to Run", "popular")).

owns("Jack",

record("Benny Goodman", "The King of Swing", "jazz")).

owns("Beth",

record("Madonna", "Madonna", "popular")).

/***** конец программы *****/

_____________________________________________________________

Приведенный ниже фрагмент показывает, как выглядела бы программа, если бы Турбо-Пролог не поддерживал конструкций альтернативных описаний доменов.

domains person,whatever,author,title = symbol

artist,album,type

= symbol

misc_thing

= misc_thing(whatever)

book_library

= book(author,title)

record_library = record(artist,album,type)

predicates personal_thing(person,misc_thing) personal_books(person,book_library) personal_records(person,record_library)

clauses personal_thing("Bill",misc_thing("sail boat")). personal_books("Bill",book("J.R.R. Tolkein",

"Return of the Ring")).

62

personal_records("Bill",record("Elton John", "Ice of Fire","popular")).

Программа "Предметы" использует 3 доменные структуры. Первой из них является misc_thing, единственный объект которой назван whatever. Bторая структура имеет имя book; ее объекты - это author и title. Третьей структурой является record; она скомпонована из трех объектов: artist, album и type.

Объекты всех трех структур относятся к типу symbol. Все три объединены под именем thing. Описанием этого домена является

thing = misc_thing(whatever)

;

book(author,title)

;

record(artist,album,type)

Для разделения альтернативных доменов здесь применена точка с запя-

той (;).

Для связи персоны и того, чем эта персона обладает, введен очень простой предикат:

person(person, things)

Использование альтернативных доменов позволяет писать в утверждениях предикат owns применительно к различным классам вещей. В отсутствие этой конструкции требовалось бы ввести уже три предиката, как это видно из приведенного фрагмента.

Попробуйте обратиться к программе "Предметы" с таким целевым предложением:

owns(P,misc_thing(T)).

Перевод этого запроса на естественный язык выглядит так: "Перечислите все возможные вещи, которыми кто-либо обладает." Интересно по-

пробовать и запросы owns(_,book(A,T)) и owns(P,record(_,A,_)).

Заметим, что термы misc_thing, book и record являются именами структур. Однако когда они появляются в предикатных выражениях, то одновременно играют и роль имен функторов.

Турбо-Пролог не делает различия между функтором и доменной структурой. Это средство введено в Турбо-Пролог преднамеренно, так как оно очень удобно именно в декларативных языках.

*Упражнения

3.11.Запустите программу "Предметы" и введите внешнюю цель

owns(_,book(_,T)).

Какой текст появится на экране ? Сформулируйте запрос на естественном языке.

3.12. Повторите запуск программы со следующей внешней целью: owns(P,record(_,A,_)).

Что можно будет увидеть на экране ? Сформулируйте данный запрос на естественном языке.

63

Программа "Предметы - 2" (листинг 3.10) представляет собой видоизмененный вариант программы "Предметы".

____________________________________________________________

Листинг 3.10

/* Программа: Предметы - 2 Файл: PROG0310.PRO */ /* Назначение: Демонстрация использования конструкций */

/*

альтернативных доменов.

*/

domains

 

 

 

 

thing = misc_thing(whatever)

;

 

 

book(author,title)

;

 

 

record(artist,album,type)

person,

whatever, author, title,

artist,album,type = symbol

predicates owns(person,thing) show_misc_things show_books show_records

goal

write("Here are the books:"), nl, nl, show_books.

clauses

/* факты */ /* Различные вещи */

owns("Bill",

misc_thing("sail boat")). owns("Bill", misc_thing("sports car")).

owns("Jack", misc_thing("мotor cycle")).

owns("Jack",

misc_thing("house trailer")). owns("Beth",

misc_thing("Chevy wagon")). owns("Beth",

misc_thing("Piano")). owns("Linda", misc_thing("motor boat")). /* книги */

owns("Bill",

book("J.R.R. Tolkein",

64

"Return of the Ring")). owns("Bill",

book("James A. Mishener", "Space")).

owns("Jack", book("Manuel Puig",

"Kiss of the Spider Woman")). owns("Beth",

book("Frank Herbert", "Dune")).

owns("Beth",

book("Tom Clancy",

"The Hunt for Red October")). owns("Linda",

book("Garrison Keillor", "Lake Wobegon Days")). /* грампластинки */

owns("Bill", record("Elton John",

"Ice Fair", "popular")). owns("Bill",

record("Michael Jackson - Lionel Richie", "We are the World",

"popular")). owns("Jack",

record("Bruce Springsteen", "Born to Run", "popular")).

owns("Jack",

record("Benny Goodman", "The King of Swing", "jazz")).

owns("Beth",

record("Madonna", "Madonna", "popular")). /* правила */

show_misc_things :-

owns(Owner, misc_thing(Whatever)), write(Owner," ",Whatever), nl, fail.

show_misc_things. show_books :-

owns(_,book(_,Title)), write(" ",Title), nl, fail.

show_books. show_records :-

owns(Owner,record(_,Album,_)), write(" ",Owner," ",Album), nl,

65