Build a lambda expression (maps to Lean lambda).
(vars: ExprRef | Sequence[ExprRef], body: ExprRef)
| 2182 | |
| 2183 | |
| 2184 | def Lambda(vars: ExprRef | Sequence[ExprRef], body: ExprRef) -> ExprRef: |
| 2185 | """Build a lambda expression (maps to Lean lambda).""" |
| 2186 | vs = [vars] if isinstance(vars, ExprRef) else list(vars) |
| 2187 | bound_names = frozenset( |
| 2188 | (v._ast.name, v._sort._ast_sort) for v in vs if isinstance(v._ast, _AstVar) |
| 2189 | ) |
| 2190 | free = body._vars - bound_names |
| 2191 | for v in vs: |
| 2192 | free = free | v._vars - bound_names |
| 2193 | |
| 2194 | ast: ASTNode = body._ast |
| 2195 | for v in reversed(vs): |
| 2196 | ast = LambdaNode( |
| 2197 | name=v._ast.name if isinstance(v._ast, _AstVar) else str(v._ast), |
| 2198 | sort=v._sort._ast_sort, |
| 2199 | body=ast, |
| 2200 | ) |
| 2201 | return ExprRef(ast, body._sort, free) |
| 2202 | |
| 2203 | |
| 2204 | # --------------------------------------------------------------------------- |