forked from thanhnguyen-aws/plausible
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathMutuallyRecursiveRelationsTest.lean
More file actions
68 lines (60 loc) · 2.43 KB
/
Copy pathMutuallyRecursiveRelationsTest.lean
File metadata and controls
68 lines (60 loc) · 2.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import Plausible.Arbitrary
import Plausible.Chamelean.ArbitrarySizedSuchThat
import Plausible.Chamelean.DeriveConstrainedProducer
set_option guard_msgs.diff true
mutual
inductive Even : Nat → Prop where
| zero_is_even : Even .zero
| succ_of_odd_is_even : ∀ n : Nat, Odd n → Even (.succ n)
inductive Odd : Nat → Prop where
| succ_of_even_is_odd : ∀ n : Nat, Even n → Odd (.succ n)
end
/-- To make the derived generators below compile, we need to
manually add a dummy instance of `ArbitrarySizedSuchThat` for one of the relations, since Lean doesn't support
mutually recursively typeclass instances currently.
Note that the instance of `ArbitrarySizedSuchThat` for `Odd` below (produced by `#derive_generator`)
will shadow this one -- it takes precedence over this dummy instance. -/
instance : ArbitrarySizedSuchThat Nat (fun n => Odd n) where
arbitrarySizedST (_ : Nat) := return 1
/--
info: Try this generator: instance : ArbitrarySizedSuchThat Nat (fun n_1 => Even n_1) where
arbitrarySizedST :=
let rec aux_arb (initSize : Nat) (size : Nat) : OptionT Plausible.Gen Nat :=
match size with
| Nat.zero =>
OptionTGen.backtrack
[(1, return Nat.zero),
(1, do
let n ← ArbitrarySizedSuchThat.arbitrarySizedST (fun n => Odd n) initSize;
return Nat.succ n)]
| Nat.succ size' =>
OptionTGen.backtrack
[(1, return Nat.zero),
(1, do
let n ← ArbitrarySizedSuchThat.arbitrarySizedST (fun n => Odd n) initSize;
return Nat.succ n),
]
fun size => aux_arb size size
-/
#guard_msgs(info, drop warning) in
#derive_generator (fun (n : Nat) => Even n)
/--
info: Try this generator: instance : ArbitrarySizedSuchThat Nat (fun n_1 => Odd n_1) where
arbitrarySizedST :=
let rec aux_arb (initSize : Nat) (size : Nat) : OptionT Plausible.Gen Nat :=
match size with
| Nat.zero =>
OptionTGen.backtrack
[(1, do
let n ← ArbitrarySizedSuchThat.arbitrarySizedST (fun n => Even n) initSize;
return Nat.succ n)]
| Nat.succ size' =>
OptionTGen.backtrack
[(1, do
let n ← ArbitrarySizedSuchThat.arbitrarySizedST (fun n => Even n) initSize;
return Nat.succ n),
]
fun size => aux_arb size size
-/
#guard_msgs(info, drop warning) in
#derive_generator (fun (n : Nat) => Odd n)