Пролог - приоритет операторов - Братко - Глава 3 - PullRequest
0 голосов
/ 06 января 2019

Я работаю над упражнениями в главе 3 «Программирование пролога для искусственного интеллекта» Ивана Братко.

В упражнении 3.13 говорится:

Предложите соответствующее определение операторов ('было', 'из', 'the') для уметь писать предложения вроде:

Диана была секретарем отдела.

и затем спросите Пролога:

? - Кто был секретарем отдела.

Кто = Диана

? - Диана была Что.

Что = секретарь отдела.

Ответ на это упражнение:

:- op(300, xfx, was).
:- op(200, xfx, of).
:- op(100, fx, the).

Однако я не уверен, как будет выглядеть структура термина «Диана была секретарем департамента». Я знаю, что оператор с наивысшим приоритетом является основным функтором выражения, поэтому в этом случае основным функтором был бы «был».

Мой ответ на вопрос, какова структура этого термина:

was(diana, of(the(secretary, the(department))).

Я не знаю, правильный ли мой ответ, поэтому мне было интересно, если кто-нибудь мог бы помочь прояснить это.

1 Ответ

0 голосов
/ 06 января 2019

Предикат ISO - write_canonical/1 [swi-doc] , который печатает такое выражение каноническим способом, например:

?- write_canonical(Who was the secretary of the department).
was(_,of(the(secretary),the(department)))
true.

Итак, мы видим, что the/1 связывается ближе, чем of/2 и was/2.

Конечно, это не просто догадки Пролога, вы определяете приоритет в вашем op/3 [swi-doc] вызове. Первый параметр - это приоритет. В документации сказано, что:

Precedence - это целое число от 0 до 1200. (...) Для x приоритет аргумента должен быть строго ниже. Приоритет терма равен 0, если только его главный функтор не является оператором, и в этом случае приоритет имеет приоритет этого оператора. Термин, заключенный в скобки ( ... ), имеет приоритет 0.

Так что, если приоритет ниже, он связывает "ближе". Скобки имеют приоритет 0 и, следовательно, имеют приоритет над всеми другими операторами.

Поскольку оператор the/1 в вашем определении имеет приоритет 100, это означает, что the связывается ближе, а of/2 будет привязываться на более высоком уровне, чем the/1, а was/2 будет привязываться к более высокий уровень в синтаксическом дереве, чем of/2.

Если вы хотите добавить факт, что diana был секретарем департамента, вы должны написать такой факт, как:

was(diana, of(the(secretary), the(department))).

Тогда мы можем запросить как:

?- Who was the secretary of the department.
Who = diana.
...