Inductive

型とか命題の定義を行う。


回文の定義で、

Inductive pal {X:TYpe} : list X -> Prop :=
 | p_zero: pal []
 | p_one : forall x:X, pal [x]
 | p_2   : forall l,  pal (l ++ (rev l))
 | p_3   : forall l1 l2, pal l2 ->  pal (l1 ++ l2 ++ (rev l1)).

とか、今から考えるとやたらややこしいことやって、pal l -> l = rev lの証明もなんとか出来たけど、

Inductive pal {X:TYpe} : list X -> Prop :=
 | pal_0 : pal []
 | pal_1 : forall x:X, pal [x]
 | pal_n : forall (x:X) l, pal l -> pal (x :: l ++ [x]).

で十分だった。
証明も圧倒的に簡単になった。