Definition next_ptd (ptd:pt_dot): option pt_dot :=
match ptd with
| Shift_ptd term sem ptl ptlz =>
Some (build_pt_dot ptl (Cons_ptl_ptlz (Terminal_pt term sem) ptlz))
| Reduce_ptd ptlz =>
let 'existT _ _ (existT _ _ (ptz, pt)) := pop_ptlz Nil_ptl ptlz in
match ptz in pt_zipper sym _ _ return parse_tree sym _ _ -> _ with
| Top_ptz => fun pt => None
| Cons_ptl_ptz ptl ptlz' =>
fun pt => Some (build_pt_dot ptl (Cons_ptl_ptlz pt ptlz'))
end pt
end.

Lemma next_ptd_cost:
forall ptd,
match next_ptd ptd with
| None => ptd_cost ptd = 0
| Some ptd' => ptd_cost ptd = S (ptd_cost ptd')
end.