Правильно.Чтобы быть точным, это зависит от точного определения синтаксиса лямбда-терминов, точнее, правил для исключения скобок, но для этих правил есть соглашение.В частности, обычно приложение
- имеет приоритет над абстракцией , поэтому сначала вы пытаетесь сформировать приложение от
xz
до yz
, и только затем абстракции над x
, y
и z
вместо того, чтобы сначала формировать абстракцию λxyz.xz
, а затем встраивать результирующий термин в приложение к yz
(это то, что вы получили бы, если бы абстракция имела приоритет над приложением); - брекетинг в терминах приложения является ассоциативным слева, поэтому
xzyz
(без скобок вокруг yz
) будет читаться как ((xz)y)z
, а чтобы указать, что xz
применяется к yz
, необходимо заключить в скобкитермин yz
.
Итак, как вы подозреваете, λxyz.xz(yz)
- это трехкратная абстракция над xz(yz)
, которая сама является приложением от xz
до yz
, которыеснова приложения от x
до z
и y
до z
, соответственно.
При наличии всех скобок термин λx.(λy.(λz.(xz(yz))))
.
Синтаксическое дерево для термина выглядит следующим образом:
λxyz.xz(yz): abstraction
|- x: variable
|- λyz.xz(yz): abstraction
|- y: variable
|- λz.xz(yz): abstraction
|- z: variable
|- xz(yz): application
|- xz: application
| |- x: variable
| |- z: variable
|- yz: application
|- y: variable
|- z: variable
И, как вы правильно подозреваете, приложениеот λxyz.xz
до yz
будет записано как (λxyz.xz)yz
.