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

Комментарии

Хорошим стилем программирования является включение в вашу программу

комментариев, объясняющих все то, что может быть непонятно кому-то друго-

му (или вам самому спустя полгода). Это делает вашу программу проще для

понимания и вами, и всеми другими. Если вы подбираете подходящие имена

для переменных, предикатов и доменов, то вам уже не нужно каких-либо до-

полнительных комментариев, т.к. ваша программа объясняет сама себя.

Многострочные комментарии должны начинаться с символов "/*" (косая

черта, звездочка) и завершаться символами "*/" (звездочка, косая черта).

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

же самые символы, либо начинать комментарий символом процента (%).

/*Это пример комментария*/

%Это также комментарий

/************************/

/*и эти три строки тоже*/

/************************/

/*Кроме того, в Турбо Прологе вы можете вкладывать

комментарий /*в комментарий*/, вот как этот*/

Что такое Сопоставление?

В предыдущих разделах данной главы вы познакомились с тем, как Про-

лог "сопоставляет вопросы и ответы", "ищет сопоставление", "сопоставляет

условия с фактами", "сопоставляет переменные с константами" и т.д. В дан-

ном разделе объясняется, что же понимается под термином "сопоставление".

В Прологе имеется несколько примеров сопоставления одной вещи с дру-

гой. Ясно, что идентичные структуры сопоставимы (сравнимы) друг с другом:

parent (joe, tammy) сопоставимо (сравнимо)

с parent (joe, tammy)

Однако, сопоставление (сравнение) обычно использует одну или нес-

колько свободных переменных. Например: если X свободна, то

parent (joe, X) сопоставимо с parent (joe, tammy)

и X принимает значение (связывается с) "tammy".

Если же X уже связана, то она действует также, как обычная констан-

та. Таким образом, если X связана со значением "tammy", то

parent (joe, X) сопоставимо с parent (joe, tammy), однако

parent (joe, X) не сопоставимо с parent (joe, millie)

Во втором примере сопоставление не выполняется, т.к. если переменная

становится связанной, то ее значение не может изменяться.

Как может переменная оказаться уже связанной при попытке Пролога со-

поставления ее с чем либо? Вспомните, что переменные не могут хранить

значения, т.к. они становятся связанными только на промежуток времени,

необходимый для отыскания (или попытки отыскания) одного решения одной

цели. Поэтому, имеется только одна возможность того, что переменная может

оказаться связанной перед попыткой сопоставления - если цель требует

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

ример:

parent (joe, X) and parent (X, jenny)

является корректной целью. Она означает: "Найти кого-либо, являющегося

ребенком Joe и родителем Jenny". Здесь при достижении подцели parent (X,

jenny) переменная X уже будет связана. Если для подцели parent (X, jenny)

нет решений, - Пролог "развяжет" переменную X и вернется назад, пытаясь

найти новое решение для parent (joe, X), а затем проверит, будет ли рабо-

тать parent (X, jenny) с новым значением X.

Две свободные переменные могут сопоставляться друг с другом. Напри-

мер:

parent (joe, X) сопоставляется с parent (joe, Y),

связывая при этом переменные X и Y между собой. С момента "связывания" X

и Y трактуются как одна переменная и любое изменение значения одной из

них приводит к немедленному соответствующему изменению другой. В случае

подобного "связывания" между собой нескольких свободных переменных - все

они называются совмещенными свободными переменными. Некоторые действи-

тельно мощные методы программирования специально используют "взаимосвязы-

вание" свободных переменных, являющихся, на самом деле, различными.

В Прологе связывание переменных (со значениями) производится двумя

способами: на входе и выходе. Направление, в котором передаются значения,

указывается в "шаблоне потока параметров". Когда переменная передается в

предложение - она считается входным параметром и обозначается (i); когда

же переменная возвращается из предложения - она является выходным пара-

метром и обозначается (o).

Выводы

Ниже сведены основные идеи, введенные в данной главе:

1. Пролог'овская программа состоит из предложений, которые могут

быть фразами двух типов: фактами или правилами.

# Факты - это связи или свойства, о которых вы (программист) твердо

знаете, что они истинны.

# Правила - это зависимые связи (отношения); они позволяют Прологу

выводить один фрагмент информации из другого.

2. Факты могут иметь вид:

property (object, object,...,object)

или

relation (object, object,...,object)

где property - это свойство объектов, а relation - связь между объектами.

Различия между этими понятиями несущественны, и, поэтому, в дальнейшем мы

будем использовать термин "связь".

3. Каждый факт программы задает либо связь, влияющую на один или бо-

лее объектов, либо свойство одного или более объектов. Например, в факте

Пролога

likes (tom, baseball)

связь - это likes (нравится), а объекты - tom (Том) и baseball (бейсбол):

Тому нравится бейсбол. В другом факте

left_hauded (benjamin)

left_hauded (левый крайний) является свойством объекта benjamin; другими

словами: Бенджамин - левый крайний.

4. В общем виде правила имеют заголовок и тело, которые выглядят в

соответствии со следующей программой:

relation (object, object,...,object) if

relation (object,...,object) and

...

...

relation (object,...,object).

5. Сообразуясь со следующими ограничениями, вы можете устанавливать

любые имена для связей и объектов в своей программе:

# Имя объекта должно начинаться со строчной буквы, за которой может

быть любое число символов. Этими символами могут быть: буквы верхне-

го и нижнего регистров, цифры и символы подчеркивания.

# Имена свойств и связей должны начинаться с буквы, за которой может

следовать любая комбинация букв, цифр и символов подчеркивания.

6. Предикат - это символическое имя (идентификатор) связи с последо-

вательностью аргументов. Программа на Прологе - это последовательность

предложений и директив, а процедура - это последовательность предложений,

описывающих предикат. Предложения, принадлежащие одному предикату, должны

следовать друг за другом.

7. Переменные позволяют вам записывать общие факты и правила и зада-

вать общие вопросы.

# Имя переменной в Турбо Прологе должно начинаться с заглавной буквы

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

любое число букв (верхнего и нижнего регистра), цифр и символов под-

черкивания.

# Переменные в Прологе получают свои значения в результате сопостав-

ления констант в фактах или правилах. До получения значения перемен-

ная является свободной, после - становится связанной.

# Вы не можете длительно хранить информацию с помощью "связывания"

переменной со значением, т.к. переменная является связанной только в

пределах предложения.

8. Если в запросе вас интересует только определенная информация, то

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

переменные. В Прологе анонимные переменные обозначаются одиночным симво-

лом подчеркивания (_).

Анонимная переменная может быть использована вместо любой другой пе-

ременной; она сопоставляется с чем угодно. Анонимная переменная никогда

не принимает какого-либо значения.

9. Задание Прологу вопросов о фактах в вашей программе называется

запросами к системе Пролога; более общим термином для запроса является

"цель". Пролог пытается разрешить цель (ответить на вопрос), начиная с

первого факта и просматривая все факты до достижения последнего из них.

10. Составная цель - это цель, включающая две или более частей; каж-

дая часть составной цели называется подцелью. Составная цель может быть

конъюктивной (подцель A and подцель B) или дизъюктивной (подцель A or

подцель B).

11. Комментарии делают вашу программу более удобной для чтения. Вы

можете заключать комментарии в разделители /*как здесь */ или предварять

их одним символом процента, % как здесь.

12. В Прологе имеется несколько способов сопоставления одного с дру-

гим:

# Идентичные структуры сопоставляются друг с другом.

# Свободная переменная сопоставляется с константой или с ранее свя-

занной переменной (и становится связанной с соответствующим значени-

ем).

# Две свободные переменные могут сопоставляться (и связываться) друг

с другом. С момента связывания они трактуются как одна переменная:

если одна из них принимает какое-либо значение, то вторая немедленно

принимает то же значение.

13. Для обеспечения еще более легкого чтения программ на Турбо Про-

логе следующие символы и слова в нем являются попарнозаменяемыми: "if" и

":-", "and" и ",", "or" и ";". Таким образом, следующие два фрагмента

программы идентичны:

is_older (Person1, Person2) if is_older (Person1, Person2):-

age (Person1, Age1) and age (Person1, Age1),

age (Person2, Age2) and age (Person2, Age2),

Age1 > Age2. Age1 > Age2.

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