I did a bad git rebase before merging #5283, which reverted it to an earlier version. This PR has the actual implementation of RFC #5397.
68 lines
1.2 KiB
Text
68 lines
1.2 KiB
Text
inductive Exp
|
||
| hole
|
||
| var (i : UInt32)
|
||
| app (a b : Exp)
|
||
with
|
||
/-- Computes the hash -/ @[simp, computed_field] protected hash : Exp → UInt64
|
||
| .var i => Hashable.hash i
|
||
| .app a b => mixHash a.hash b.hash
|
||
| .hole => 32
|
||
|
||
def dagLikeTerm : Nat → Exp
|
||
| 0 => .app (.var 42) .hole
|
||
| n+1 => .app (dagLikeTerm n) (dagLikeTerm n)
|
||
|
||
#guard (dagLikeTerm 1000).hash == 10432648428259852868 -- memoized
|
||
|
||
def varNum? : Exp → Option UInt32
|
||
| .var i => i
|
||
| _ => none
|
||
|
||
example : varNum? (.var 32) = some 32 := by native_decide
|
||
|
||
|
||
|
||
|
||
|
||
namespace WithIndices
|
||
|
||
inductive B.C (α : Type u) : Nat → Type u
|
||
| a : C α 0
|
||
| b (c : C α n) {d : C α (n-1)} : C α (n+1)
|
||
with
|
||
@[computed_field] hash : ∀ α i, C α i → UInt64
|
||
| _, _, .a => 1
|
||
| _, _, .b c => 42 + c.hash _ _
|
||
|
||
#guard (B.C.b (α := Nat) (.a) (d := .a)).hash _ _ == 43
|
||
|
||
end WithIndices
|
||
|
||
|
||
|
||
|
||
|
||
|
||
namespace Mutual
|
||
|
||
mutual
|
||
inductive A
|
||
| a (b : B)
|
||
| b (b : B)
|
||
with
|
||
@[computed_field] f : A → Nat
|
||
| .a c => 32 + c.f
|
||
| .b c => 42 + 2*c.f
|
||
|
||
inductive B
|
||
| c (a : A)
|
||
| d
|
||
with
|
||
@[computed_field] f : B → Nat
|
||
| .c a => a.f
|
||
| .d => 0
|
||
end
|
||
|
||
#guard (B.c (.a .d)).f == 32
|
||
|
||
end Mutual
|