Бета-сокращение лямбда-исчисления - PullRequest
1 голос
/ 21 января 2020

У меня есть следующее лямбда-исчисление:

1) λx. катце (х) (Гарфилд)

2) λP. λx. P (x) (чай)

3) λy. λx. лайки (x, y) (Mia)

Как мне уменьшить их с помощью Beta Reduction?

Мои решения:

1) katze (Гарфилд)

2) чай

3) лайки (Mia)

1 Ответ

0 голосов
/ 21 января 2020

При выполнении бета-сокращения вы заменяете связанную переменную на лямбда-функцию с предоставленным значением. Обозначение для этого [param := value], и вы берете первую переменную, которая дается.

В случае λx . katze(x)(Garfield) -> katze (Garfield) правильное уменьшение. Мы заменили переменную x на Garfield и удалили λx в процессе, оставив только выражение внутри. Вот шаги, которые будут предприняты:

λx . katze(x)(Garfield)

= katze(x)[x := Garfield]

= katze(Garfield)

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

В случае λP . λx . P(x)(tea) это может быть лучше представлено как (λP . (λx . P(x)))(tea), где теперь каждая лямбда-функция заключена в скобки. Поскольку мы поставляем один вход tea, мы разрешаем внешнюю функцию только с параметром P (оставляя скобки для некоторой ясности):

(λP . (λx . P(x)))(tea)

= (λx . P(x))[P := tea]

= (λx . P(x))

= λx . tea(x)

или без скобок:

λP . λx . P(x)(tea)

= λx . P(x)[P := tea]

= λx . tea(x)

Что касается конечной функции, она по-прежнему имеет ту же проблему, что и удаление обеих функций, когда дается только один вход. Правильные шаги восстановления:

λy . λx . likes(x, y)(Mia)

= λx . likes(x, y)[y := Mia]

= λx . likes(x, Mia)

...