This PR ensures that the branches of an `if-then-else` term are internalized only after establishing the truth value of the condition. This change makes its behavior consistent with the `match`-expression and dependent `if-then-else` behavior in `grind`. This feature is particularly important for recursive functions defined by well-founded recursion and `if-then-else`. Without lazy `if-then-else` branch internalization, the equation theorem for the recursive function would unfold until reaching the generation depth threshold, and before performing any case analysis. See new tests for an example.
24 lines
645 B
Text
24 lines
645 B
Text
def f (n : Nat) (m : Nat) :=
|
|
if n < m then
|
|
f (n+1) m + n
|
|
else
|
|
n
|
|
|
|
/--
|
|
info: [grind.ematch.instance] f.eq_def: f 5 m = if 5 < m then f (5 + 1) m + 5 else 5
|
|
-/
|
|
#guard_msgs (info) in
|
|
set_option trace.grind.ematch.instance true in
|
|
example : f 5 m > 0 := by
|
|
fail_if_success grind (splits := 0) [f.eq_def]
|
|
sorry
|
|
|
|
/--
|
|
info: [grind.ematch.instance] f.eq_def: f 5 m = if 5 < m then f (5 + 1) m + 5 else 5
|
|
[grind.ematch.instance] f.eq_def: f 6 m = if 6 < m then f (6 + 1) m + 6 else 6
|
|
-/
|
|
#guard_msgs (info) in
|
|
set_option trace.grind.ematch.instance true in
|
|
example : f 5 m > 0 := by
|
|
fail_if_success grind (splits := 1) [f.eq_def]
|
|
sorry
|