Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Задание типов аргументов при декларации предикатов

Объявление домена аргументов в секции predicates называется заданием

типа аргумента. Например, предположим у вас имеется следующая связь объ-

ектов:

Франк - мужчина, которому 45 лет.

Факт Пролога, соответствующий этому предложению естественного языка,

может быть следующим:

person(frank, male, 45).

Для того, чтобы объявить person (человек), как предикат с этими тре-

мя аргументами, вы можете разместить в секции predicates следующую стро-

ку:

person(symbol, symbol, integer).

Здесь для всех трех аргументов вы использовали стандартные домены.

Отныне, всякий раз, когда бы вы не использовали предикат person, вы долж-

ны передавать ему три аргумента, причем первые два должны быть типа

symbol, а третий - типа integer.

Если в вашей программе используются только стандартные домены, то

нет необходимости использовать секцию domain (вы уже видели несколько

программ такого типа).

Или, предположим, что вы хотите описать предикат, который сообщал бы

вам позицию буквы в алфавите, т.е. цель

alphabet_position(Letter, Position)

должна вернуть вам Position = 1, если Letter = a, Position = 2, если

Letter = b и т.д. Предложения этого предиката могут выглядеть следующим

образом:

alphabet_position(A_character, N).

Если при объявлении предиката используются только стандартные доме-

ны, то программе не нужна секция domains. Предположим, что вы хотите опи-

сать предикат так, что цель будет истинна, если A_character является n-ым

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

alphabet_position('a', 1).

alphabet_position('b', 2).

alphabet_position('c', 3).

...

alphabet_position('z', 26).

Вы можете объявить данный предикат следующим образом:

predicates

alphabet_position(char, integer)

и тогда вам не будет нужна секция domains. Если разместить все фрагменты

программы вместе, получим:

predicates

alphabet_position(char, integer)

clauses

alphabet_position('a', 1).

alphabet_position('b', 2).

/*...здесь должны быть все остальные буквы...*/

alphabet_position('z', 26).

Ниже представлено несколько простых целей, которые вы можете ввести:

alphabet_position('a', 1).

alphabet_position(X, 3).

alphabet_position('z', What).

Упражнения

1. Программа /*Программа CH04EX04.PRO*/ представляет собой закончен-

ную программу Турбо Пролога, служащую небольшим телефонным справочником.

Так как используются только стандартные предикаты, - секция domains в

этой программе не нужна.

/*Программа CH04EX04.PRO*/

predicates

phone_number(symbol, symbol)

clauses

phone_number("Albert", "ETY-3665").

phone_number("Betty", "555-5233").

phone_number("Carol", "909-1010").

phone_number("Dorothy", "438-8400").

Загрузите и запустите программу /*Программа CH04EX04.PRO*/, а затем,

по очереди, задайте ей следующие цели:

a. phone_number("Carol", Number).

b. phone_number(Who, "438-8400").

c. phone_number("Albert", Number).

d. phone_number(Who, Number).

Теперь измените предложения. Предположим, что Kim и Dorothy имеют

один номер телефона. Добавим этот факт в секцию clauses и введем цель:

phone_number(Who, "438-8400").

На этот запрос вы должны получить два решения:

Who = Kim

Who = Dorothy

2 Solutions

2. Для иллюстрации домена char в программе CH04EX05.PRO описан пре-

дикат isletter (является_буквой), который (в случае задания ему нижепри-

веденных целей) возвращает "No" и "Yes" соответственно:

isletter('%').

isletter('Q').

(В этой программе отношение <= касательно символов означает их алфа-

витное старшинство.)

/*Программа CH04EX05.PRO*/

predicates

isletter(char)

clauses

/*When applied to characters, '<=' means*/

/*"alphabetically precedes or is the same as"*/

isletter(Ch) :- 'a' <=Ch, Ch <= 'z'.

isletter(Ch) :- 'A' <=Ch, Ch <= 'Z'.

Загрузите и запустите программу CH04EX05.PRO и испытайте, по очере-

ди, каждую из этих целей:

a. isletter('x').

b. isletter('2').

c. isletter('hello').

d. isletter(a).

e. isletter(X).

Цели (c) и (d) приведут к сообщению об ошибке типа, а цель (e) вер-

нет сообщение "Unbound Variable" ("Несвязанная Переменная"), т.к. вы не

можете проверить старшинство незаданного объекта по отношению к 'a' или

'z'.

Соседние файлы в папке Документация