TURBO PROLOG. Терёхин В.В. - 26 стр.

UptoLike

Составители: 

26
Переменная What не имеет значения, так как она неозначена, или не-
инициализирована. Эти два термина используются как взаимозаменяемые.
Неозначенные переменные еще называются свободными переменными. Ко-
гда свободная переменная цели What сопоставляется с соответствующим
объектом apples, значением What становится apples. Теперь переменная
What означена (или инициализирована) объектом apples. Другими словами,
эта переменная
более не свободна (связана).
Пока What имеет значение apples, эта переменная для Турбо-Пролога
"означает" apples. Фактически всякий раз, когда неозначенная переменная
сопоставляется с константой, она получает значение этой константы. Тур-
бо-Пролог выдает на экран, что What=apples , и, что внутренняя подпро-
грамма унификации нашла все (единственный) объекты,
сопоставимые с
целью.
Теперь предположим, что программа содержит следующие факты:
likes(mary, apples). /* Мэри любит яблоки */
likes(mary, pears). /* Мэри любит персики */
likes(mary, popcorn). /* Мэри любит кукурузные зерна */
Такая же цель, что и выше likes(mary, What) сопоставима со всеми
этими фактами. Поэтому Турбо-Пролог выдает все значения
для What, кото-
рые удовлетворяют этой цели. Внешние цели заставляют внутренние уни-
фикационные подпрограммы Турбо-Пролога найти все решения, удовлетво-
ряющие цели. Но внутренние цели заставляют внутренние унификацион-
ные подпрограммы останавливаться после первого успешного сопоставле-
ния цели.
Может показаться, что переменная What получает значения apples,
pears и popcorn в одно и
тоже время, но это не так. Подпрограммы внут-
ренней унификации присваивают переменной конкретное значение только
во время сопоставления. Переменная становится вновь свободной, когда со-
поставление оказывается неуспешным или цель оказывается успешно вы-
численной.
Программисты, имеющие опыт работы с императивными языками,
иногда нелегко понимают "ликвидацию значения" или освобождение пере-
менной. Обычно
в императивных языках, если переменная получила значе-
ние, то сохраняет его в области своего определения до тех пор, пока ей не
будет присвоено новое значение. Такие присваивания значений находятся
под строгим контролем операторов программы. Но в Турбо-Прологе при-
сваивания значений переменным выполняется внутренними подпрограммами
унификации. Переменные становятся свободными, как только
для внут-
ренних подпрограмм унификации отпадает необходимость связывать неко-
торое значение с переменной для выполнения доказательства подцели.
Может показаться, что в Прологе нельзя управлять значениями, кото-
рые присваиваются переменным. Действительно, Пролог не имеет "грубых
средств" для управления значениями, точно также в Прологе нет "грубых
средств" для управления ходом выполнения программы
. Но, понимая
принцип работы внутренних унификационных подпрограмм, программист
      Переменная What не имеет значения, так как она неозначена, или не-
инициализирована. Эти два термина используются как взаимозаменяемые.
Неозначенные переменные еще называются свободными переменными. Ко-
гда свободная переменная цели What сопоставляется с соответствующим
объектом apples, значением What становится apples. Теперь переменная
What означена (или инициализирована) объектом apples. Другими словами,
эта переменная более не свободна (связана).
      Пока What имеет значение apples, эта переменная для Турбо-Пролога
"означает" apples. Фактически всякий раз, когда неозначенная переменная
сопоставляется с константой, она получает значение этой константы. Тур-
бо-Пролог выдает на экран, что What=apples , и, что внутренняя подпро-
грамма унификации нашла все (единственный) объекты, сопоставимые с
целью.
      Теперь предположим, что программа содержит следующие факты:
      likes(mary, apples).   /* Мэри любит яблоки       */
      likes(mary, pears).   /* Мэри любит персики        */
      likes(mary, popcorn). /* Мэри любит кукурузные зерна */
      Такая же цель, что и выше likes(mary, What) сопоставима со всеми
этими фактами. Поэтому Турбо-Пролог выдает все значения для What, кото-
рые удовлетворяют этой цели. Внешние цели заставляют внутренние уни-
фикационные подпрограммы Турбо-Пролога найти все решения, удовлетво-
ряющие цели. Но внутренние цели заставляют внутренние унификацион-
ные подпрограммы останавливаться после первого успешного сопоставле-
ния цели.
      Может показаться, что переменная What получает значения apples,
pears и popcorn в одно и тоже время, но это не так. Подпрограммы внут-
ренней унификации присваивают переменной конкретное значение только
во время сопоставления. Переменная становится вновь свободной, когда со-
поставление оказывается неуспешным или цель оказывается успешно вы-
численной.
      Программисты, имеющие опыт работы с императивными языками,
иногда нелегко понимают "ликвидацию значения" или освобождение пере-
менной. Обычно в императивных языках, если переменная получила значе-
ние, то сохраняет его в области своего определения до тех пор, пока ей не
будет присвоено новое значение. Такие присваивания значений находятся
под строгим контролем операторов программы. Но в Турбо-Прологе при-
сваивания значений переменным выполняется внутренними подпрограммами
унификации. Переменные становятся свободными, как только для внут-
ренних подпрограмм унификации отпадает необходимость связывать неко-
торое значение с переменной для выполнения доказательства подцели.
      Может показаться, что в Прологе нельзя управлять значениями, кото-
рые присваиваются переменным. Действительно, Пролог не имеет "грубых
средств" для управления значениями, точно также в Прологе нет "грубых
средств" для управления ходом выполнения программы. Но, понимая
принцип работы внутренних унификационных подпрограмм, программист


                                                                       26