Предикат 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.