| 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 |