Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка_РЛП_4_форм.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
644.61 Кб
Скачать

3.3.Семантика языка пролог

Декларативная семантика. Словесная интерпретация языка Пролог.

Факты в Прологе интерпретируются как безусловные утверждения, которые понимаются как истинные. Правила интерпретируются как сложные условные утверждения о том, что истинность некоторого простого утверждения (задаваемого головным предикатом правила) зависит от истинности других утверждений (задаваемых предикатами в теле правила). Запятая в теле правила понимается как конъюнкция.

Пример 3.3.1. Программа «Родственные отношения». Отношение родитель(X, Y) означает, что X является родителем Y. Отношение мужчина(X) означает, что X является мужчиной (унарные отношения называют свойствами). Отношение отец(X, Y) означает, что X является отцом Y. Программа представляет собой набор фактов и правил.

родитель(пам, боб). (Памела является родителем Боба)

родитель(том, боб). (Том является родителем Боба)

родитель(том, лиз). (Том является родителем Лиз)

родитель(боб, энн). (Боб является родителем Энн)

родитель(боб, пат). (Боб является родителем Патриции)

родитель(пам, джим). (Памела является родителем Джима)

мужчина(боб). (Боб является мужчиной)

мужчина(том). (Том является мужчиной)

мужчина(джим). (Джим является мужчиной)

отец(X, Y):- родитель(X, Y),мужчина(X). (Некто является отцом кого-либо, если он его родитель и мужчина)

Вопросы Пролога интерпретируются как вопросительные предложения в естественном языке.

Пример 3.3.2. Вопросы к программе «Родственные отношения».

Является ли Боб родителем Пат?

?- родитель(боб, пат).

yes

Является ли Лиз родителем Пат?

?- родитель(лиз, пат).

no

Является ли Том родителем Бен?

?- родитель(том, бен).

no

Кто является родителем Лиз?

?- родитель(X, лиз).

X = том

Кто дети Боба?

?- родитель( боб, X).

X = энн

X = пат

Кто чей родитель? Найти X и Y такие, что X - родитель Y.

?- родитель(X, Y).

X = пам Y = боб;

X = том Y = боб;

X = том Y = лиз;

Кто является отцом Лиз?

?- отец(X, лиз).

X = том

Процедурная семантика

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

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

Алгоритм 6. Пролог-интерпретатор основных конструкций.

Вход: P– программа - упорядоченное множество фактов и правил, вопрос к пролог-системе в виде списка целевых предикатов G=G1,…,Gn.

  1. берется первое предложение C из программы P. Пусть C имеет вид H:-B1, B2,..., Bm

  2. пока G1, и H не сопоставимы и программа P не исчерпана выбирать в качестве C следующее по порядку предложение

  3. если программа P исчерпана, то ВЫХОД(неудача)

  4. если для некоторого предложения C (H:-B1, B2,..., Bm) G1, и H сопоставимы и -подстановка, полученная при сопоставлении, то сформировать новый список целей G=(B1, B2,..., Bm, G2,…,Gn.)

  5. если список целей G – пуст, то КОНЕЦ РАБОТЫ(успех).

  6. если список целей G – не пуст, то применить описываемый алгоритм рекурсивно к списку целей G

  7. в случае выхода алгоритма с неудачей выбирать в качестве C следующее по порядку предложение программы P и перейти к п. 2).

Пример 3.3.3. Исполнение пролог-программы.

Вход: P– программа примера 3.2.2., G=отец(X, боб)

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

  1. 1) C=родитель(пам, боб)

  2. 2) выбираются в качестве C предложения программы P до C=отец(X1, Y1):- родитель(X1, Y1),мужчина(X1), H= отец(X1, Y1), B1=родитель(X1, Y1), B2=мужчина(X1)

  3. 3)

  4. 4) ={X=X1, Y1=боб}, G=родитель(X1, боб),мужчина(X1)

  5. 5)

  6. 6) применить описываемый алгоритм рекурсивно к списку целей G (уровень 1)

  7. 1) C=родитель(пам, боб)

  8. 2)

  9. 3)

  10. 4) ={X1= пам}, G=мужчина(пам)

  11. 5)

  12. 6) применить описываемый алгоритм рекурсивно к списку целей G (уровень 2)

  13. 1) C=родитель(пам, боб)

  14. 2) выбираются в качестве C предложения программы P до конца

  1. 3) ВЫХОД(неудача) (возврат на уровень 1 к шагу 7))

  1. 7) C=родитель(том, боб) перейти к п 2)

  2. 2)

  3. 3)

  4. 4) ={X1= том}, G=мужчина(том)

  5. 5)

  6. 6) применить описываемый алгоритм рекурсивно к списку целей G (уровень 2)

  7. 1) C=родитель(пам, боб)

  8. 2) выбираются в качестве C предложения программы P до C=мужчина(том)

  9. 3)

  10. 4) ={ }, G=пусто

  11. 5) КОНЕЦ РАБОТЫ(успех)

В ходе решения переменные получили значения X=X1, X1= том, т. е. X= том. Это значение выдается в качестве ответа.

Декларативная семантика касается только отношений, определенных в программе. Она позволяет оценить результат работы программы непосредственно исходя из текста самой программы. С другой стороны, процедурная семантика определяет результат не непосредственно, а через последовательность шагов исполнения этой программы. В силу этого декларативные аспекты программы являются, обычно, более легкими для понимания, нежели процедурные детали.

Процедурная семантика связана с порядком предикатов в правых частях предложений и с порядком предложений в программе. Неудачное их изменение, не меняющее декларативной семантики, может, однако привести к получению неверно работающих программ и даже к бесконечным циклам. Рассмотрим примеры описания предиката «предок».

Пример 3.3.4. Отношение «предок».

Вариант 1

предок1(X, Z):-родитель(X, Z).

предок1(X, Z):-родитель(X, Y), предок1(Y, Z).

Вариант 2

предок2(X, Z):- родитель(X, Y), предок2(Y, Z).

предок2(X, Z):- родитель(X, Z).

Вариант 3

предок3(X, Z):- родитель(X, Z).

предок3(X, Z):- предок3(X, Y), родитель(Y, Z).

Вариант 4

предок4(X, Z):- предок4(X, Y), родитель(Y, Z).

предок4(X, Z):- родитель(X, Z).

В последнем варианте пролог-система не сможет найти ответа, т. е. цель предок4(X, Z) прежде всего порождает аналогичную цель предок4(X, Y) и т.д. до бесконечности.

Упражнения 3.3.1.

Рассмотреть работу алгоритма пролог-интерпретатора с различными вариантами программы «предок» при различных вопросах к системе.

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