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

UptoLike

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

71
/* футбол */
plays(john,volleyball) /* Джон играет в волейбол */
plays(tom,basketball) /* Том играет в баскетбол */
plays(tom,volleyball) /* Том играет в волейбол */
plays(john,baseball) /* Джон играет в бейсбол */
Задача программы определить, в какую игру одновременно играют
Джон и Том.
Утверждение цели следующее:
plays(john,G),plays(tom,G).
Заметьте, что эта цель есть связка двух подцелей. Каждая подцель со-
держит переменную
G. Задача заключается в нахождении значения для G,
удовлетворяющего обеим подцелям.
Чтобы вычислить первую подцель plays(john,G), Турбо-Пролог ищет в
базе данных сопоставимое утверждение. Первый объект утверждения
plays(john, soccer) сопоставим с первым объектом первой подцели, так что
подцель успешно вычисляется и переменная G получает значение soccer.
Существуют другие утверждения для plays
, которые могут быть использова-
ны для вычисления этой же подцели. Поэтому Турбо-Пролог должен сохра-
нить след этих утверждений на случай неуспешного вычисления второй
подцели со значением G равным soccer. Для этого внутренние унификацион-
ные подпрограммы устанавливают указатель отката на точку, с которой мо-
гут быть продолжены усилия по вычислению
первой подцели.
Теперь Турбо-Пролог пытается вычислить вторую подцель. Так как G
имеет значение soccer, то эта подцель есть plays(tom, soccer). Турбо-
Пролог просматривает базу данных в поиске утверждения, сопоставимого с
этой подцелью. Сопоставимых утверждений нет, поэтому подцель неуспеш-
на.
Так как вторая подцель вычислена неуспешно, то Турбо-Пролог вновь
должен
начать просмотр с первой подцели. После того, как попытка вычис-
лить вторую подцель оказалась неуспешной, переменная G освобождается и
Турбо-Пролог снова начинает поиск утверждения для вычисления подцели
plays(john,G).
Следующее сопоставляемое утверждение - это
plays(john,volleyball). Переменная G получает значение volleyball. Сно-
ва указатель отката помещается на следующее утверждение. Теперь
Турбо-Пролог
пытается вычислить вторую подцель
plays(tom,volleyball). Во время этой попытки удается найти сопоставимое
утверждение. Присвоение переменной G значения volleyball приводит к
успеху. Обе подцели удовлетворены. Больше подцелей нет, поэтому вся ис-
ходная цель оказывается успешно вычисленной.
Если бы цель в этом примере была внутренней, то процесс вычисле-
ния остановился бы после
первого ее успешного вычисления. Однако цель
здесь внешняя, поэтому процесс повторяется до тех пор, пока не будут най-
дены все успешные способы вычисления цели. Но информация, содержа-
щаяся в данных утверждениях, дает только одно допустимое значение для G,
                   /* футбол */
             plays(john,volleyball) /* Джон играет в волейбол */
             plays(tom,basketball) /* Том играет в баскетбол */
             plays(tom,volleyball) /* Том играет в волейбол */
             plays(john,baseball)   /* Джон играет в бейсбол */
      Задача программы определить, в какую игру одновременно играют
Джон и Том.
      Утверждение цели следующее:
             plays(john,G),plays(tom,G).
      Заметьте, что эта цель есть связка двух подцелей. Каждая подцель со-
держит переменную G. Задача заключается в нахождении значения для G,
удовлетворяющего обеим подцелям.
      Чтобы вычислить первую подцель plays(john,G), Турбо-Пролог ищет в
базе данных сопоставимое утверждение. Первый объект утверждения
plays(john, soccer) сопоставим с первым объектом первой подцели, так что
подцель успешно вычисляется и переменная G получает значение soccer.
Существуют другие утверждения для plays, которые могут быть использова-
ны для вычисления этой же подцели. Поэтому Турбо-Пролог должен сохра-
нить след этих утверждений на случай неуспешного вычисления второй
подцели со значением G равным soccer. Для этого внутренние унификацион-
ные подпрограммы устанавливают указатель отката на точку, с которой мо-
гут быть продолжены усилия по вычислению первой подцели.
      Теперь Турбо-Пролог пытается вычислить вторую подцель. Так как G
имеет значение soccer, то эта подцель есть plays(tom, soccer). Турбо-
Пролог просматривает базу данных в поиске утверждения, сопоставимого с
этой подцелью. Сопоставимых утверждений нет, поэтому подцель неуспеш-
на.
      Так как вторая подцель вычислена неуспешно, то Турбо-Пролог вновь
должен начать просмотр с первой подцели. После того, как попытка вычис-
лить вторую подцель оказалась неуспешной, переменная G освобождается и
Турбо-Пролог снова начинает поиск утверждения для вычисления подцели
plays(john,G).
      Следующее        сопоставляемое     утверждение    -  это
plays(john,volleyball). Переменная G получает значение volleyball. Сно-
ва указатель отката помещается на следующее утверждение. Теперь
Турбо-Пролог пытается           вычислить    вторую подцель
plays(tom,volleyball). Во время этой попытки удается найти сопоставимое
утверждение. Присвоение переменной G значения volleyball приводит к
успеху. Обе подцели удовлетворены. Больше подцелей нет, поэтому вся ис-
ходная цель оказывается успешно вычисленной.
      Если бы цель в этом примере была внутренней, то процесс вычисле-
ния остановился бы после первого ее успешного вычисления. Однако цель
здесь внешняя, поэтому процесс повторяется до тех пор, пока не будут най-
дены все успешные способы вычисления цели. Но информация, содержа-
щаяся в данных утверждениях, дает только одно допустимое значение для G,


                                                                        71