【发布时间】:2021-07-03 16:08:04
【问题描述】:
我正在尝试提出一种算法,可以打印给定表达式的所有可用的 beta 缩减。
我知道我需要一个匹配的模式案例来查看项目是否可约化,如果不是,则需要变量、lambda 和应用程序的三种案例案例。我为这些定义了自定义类型,如下所示:
data Term =
Variable Var
| Lambda Var Term
| Apply Term Term
deriving Show
之前我已经实现了以下方法:
给定方法的功能如下:
- 合并
- 重命名重命名以避免变量捕获
- 替换减少表达式
- fresh 提供了一个以前未使用过的新变量
- used 返回给定表达式的所有使用变量
到目前为止,一切正常,但是,返回所有可能的 beta 减少的功能是我迷失的地方。我试图定义如下所示的四种大小写匹配模式,但是我正在努力定义 redex 案例(特别是查看其他 redex 的 redex)以及需要在 beta 方法中进行的操作。:
beta :: Term -> [Term]
beta (Variable var) =
beta (Lambda var term) =
beta (Apply term1 term2)
我现在不知道如何在此处进行以获得所有可用的折扣。结果应该是:
*Main> Apply (x y)
(\a. \x. (\y. a) x b) (\f. \x. f x)
*Main> beta it
[\c. (\b. \f. \x. f x) c b,(\a. \x. a b) (\f. \x. f x)]
【问题讨论】:
标签: algorithm haskell lambda-calculus