This PR adds the predicate `Expr.fvarsSet a b`, which returns `true` if and only if the free variables in `a` are a subset of the free variables in `b`.
29 lines
905 B
Text
29 lines
905 B
Text
import Lean
|
|
|
|
open Lean Meta
|
|
run_meta do
|
|
let nat := mkConst ``Nat
|
|
withLocalDeclD `x nat fun x =>
|
|
withLocalDeclD `y nat fun y =>
|
|
withLocalDeclD `z nat fun z =>
|
|
withLocalDeclD `w nat fun w => do
|
|
let o := mkNatLit 0
|
|
let e1 ← mkAdd x x -- x + x
|
|
let e2 ← mkAdd x y -- x + y
|
|
let e3 ← mkAdd e2 z -- (x + y) + z
|
|
let e4 ← mkAdd e2 e2 -- (x + y) + (x + y)
|
|
let e5 ← mkAdd e4 w -- ((x + y) + (x + y)) + w
|
|
let e6 ← mkAdd e5 z -- (((x + y) + (x + y)) + w) + z
|
|
assert! o.fvarsSubset e6
|
|
assert! !e6.fvarsSubset o
|
|
assert! o.fvarsSubset e1
|
|
assert! !e1.fvarsSubset o
|
|
assert! e1.fvarsSubset e1
|
|
assert! e1.fvarsSubset e2
|
|
assert! e6.fvarsSubset e6
|
|
assert! !e2.fvarsSubset e1
|
|
assert! e1.fvarsSubset e6
|
|
assert! e4.fvarsSubset e6
|
|
assert! !e3.fvarsSubset e5
|
|
assert! !e5.fvarsSubset e3
|
|
assert! e4.fvarsSubset e6
|