As an example of elaborator reflection here we step through this identity implementation: | mkId : Elab () mkId = do x <- gensym "x" attack intro x fill (Var x) solve solve natId : Nat -> Nat natId = %runElab mkId |
|
After each tactic we will look at the state:
We start with the type signature like this: | mkId : Elab () mkId = do x <- gensym "x" |
In order to investigate how the program works we can look at the proofState at each stage as the tactics are applied. So here is the proofState at the start: | |
We can also look at the logic at each stage: | |
The term is: | ?{hole_0} ≈ ? {hole_2} . {hole_2} . {hole_0} |
getEnv getGoal getHoles |
getEnv=[] |
getGuess | error no guess |
Here is the state (given by 'debug') at the start. 'pi_arg' represents the first argument of the function. If there had been other arguments they would be 'pi_arg1'.'pi_arg2'... |
Holes: ---------------------------------- {hole_2} : (__pi_arg : Prelude.Nat.Nat) -> Prelude.Nat.Nat ---------------------------------- {hole_0} : (__pi_arg : Prelude.Nat.Nat) -> Prelude.Nat.Nat |
. | attack |
Term: | ?{hole_0} ≈ ?{hole_2} ≈ ? {hole_6} . {hole_6} . {hole_2} . {hole_0} |
getEnv getGoal getHoles |
getEnv=[] |
getGuess | Not a guess |
Holes: ---------------------------------- {hole_6} : (__pi_arg : Prelude.Nat.Nat) -> Prelude.Nat.Nat ---------------------------------- {hole_2} : (__pi_arg : Prelude.Nat.Nat) -> Prelude.Nat.Nat ---------------------------------- {hole_0} : (__pi_arg : Prelude.Nat.Nat) -> Prelude.Nat.Nat |
|
intro x |
|
Term: | ?{hole_0} ≈ ?{hole_2} ≈ λ {x_105} . ? {hole_6} . {hole_6} . {hole_2} . {hole_0} |
getEnv getGoal getHoles |
getEnv=[({x_105}, {λ ({`{{Nat}}.["Nat", "Prelude"]}:{type const tag=8,0}).{TT:TType |
getGuess | not a guess |
Holes: {x_105} : Prelude.Nat.Nat ---------------------------------- {hole_6} : Prelude.Nat.Nat ---------------------------------- {hole_2} : (__pi_arg : Prelude.Nat.Nat) -> Prelude.Nat.Nat ---------------------------------- {hole_0} : (__pi_arg : Prelude.Nat.Nat) -> Prelude.Nat.Nat |
|
Substitute a guess into a hole. | fill (Var x) |
Term: | ?{hole_0} ≈ ?{hole_2} ≈ λ {x_105} . ?{hole_6} ≈ {x_105} . {hole_6} . {hole_2} . {hole_0} |
getEnv getGoal getHoles |
getEnv=[({x_105}, {λ ({`{{Nat}}.["Nat", "Prelude"]}:{type const tag=8,0}).{TT:TType |
getGuess | {TT:Parameter name ref |
Holes: {x_105} : Prelude.Nat.Nat ---------------------------------- {hole_6} : Prelude.Nat.Nat ---------------------------------- {hole_2} : (__pi_arg : Prelude.Nat.Nat) -> Prelude.Nat.Nat ---------------------------------- {hole_0} : (__pi_arg : Prelude.Nat.Nat) -> Prelude.Nat.Nat |
|
x |
|
getEnv getGoal getHoles |
x |
getGuess | x |
x |
|
x |
|
getEnv getGoal getHoles |
x |
getGuess | x |
x |