Logic.v


証明オブジェクトがどんなかたちになるかについて、
全然イメージが湧かない。
あいかわらずレバガチャ状態ではある。

Theorem or_distributes_over_and_2 : forall P Q R : Prop,
(P \/ Q) /\ (P \/ R) -> P \/ (Q /\ R).

とか。

scriptモードでも、一度泥沼に嵌ると抜けだせないし。



3 subgoals, subgoal 1 (ID 1231)
  
  P : Prop
  Q : Prop
  R : Prop
  H : (P \/ Q) /\ (P \/ R)
  H0 : P \/ Q
  H1 : P \/ R
  H2 : P
  H3 : R
  ============================
   Q
...

Theorem or_distributes_over_and_2 : forall P Q R : Prop,
(P \/ Q) /\ (P \/ R) -> P \/ (Q /\ R).
 intros P Q R H.
 inversion H.
 inversion H0.
 inversion H1.
 left. apply H2. right. split.

 (* あれ? Q? *)
Theorem or_commut : forall P Q : Prop,
P \/ Q -> Q \/ P.
Proof.
intros P Q H.
inversion H as [HP|HQ].
right. apply HP.
left. apply HQ.
Qed.
Theorem or_commut' : forall P Q : Prop,
P \/ Q -> Q \/ P.
Proof.
intros P Q H.
destruct H as [HP | HQ] eqn:H' .
right. apply HP.
left. apply HQ.
Qed.

Print or_commut.
(*
or_commut =
fun (P Q : Prop) (H : P \/ Q) =>
(fun H0 : Q \/ P => H0)
match H with
| or_introl HP => (fun HP0 : P => or_intror Q P HP0) HP
| or_intror HQ => (fun HQ0 : Q => or_introl Q P HQ0) HQ
end
: forall P Q : Prop, P \/ Q -> Q \/ P
*)
 
Print or_commut'.
(*
or_commut' =
fun (P Q : Prop) (H : P \/ Q) =>
let o := H in
let H' := eq_refl in
match o as o0 return (H = o0 -> Q \/ P) with
| or_introl HP => fun _ : H = or_introl P Q HP => or_intror Q P HP
| or_intror HQ => fun _ : H = or_intror P Q HQ => or_introl Q P HQ
end H'
: forall P Q : Prop, P \/ Q -> Q \/ P
 
*)

論理和の場合は、
destructよりinversion使ったほうが簡単になるな。

あと、Software Foundationsの Caseって

destructなどで必要となる根拠にたいし、()でくるんで、
その中で一時文字列変数を宣言してるだけなのね。