Require Import GQM.Base.
Require Import GQM.GQM.

Inductive GQMded: context -> form -> Prop :=
| gqm_in G f: In f G -> GQMded G f
| gqm_andE1 G f1 f2: GQMded G (f1 & f2) -> GQMded G f1
| gqm_andE2 G f1 f2: GQMded G (f1 & f2) -> GQMded G f2
| gqm_andI G f1 f2: GQMded G f1 -> GQMded G f2 -> GQMded G (f1 & f2)
| gqm_negI G f g: GQMded G (f ->> g) -> GQMded G (f ->> -! g) -> GQMded G (-! f) (* TODO neg intro*)
| gqm_negE G f: GQMded G (Neg (Neg f)) -> GQMded G f. (* TODO neg intro*)

Hint Constructors GQMded : GQMDB.

Lemma gqm_orE1 : forall G f1 f2, GQMded G f1 -> GQMded G (f1 ||| f2).
Proof.
  move => G f1 f2 Hf1.
  unfold Or.
  apply: (gqm_negI _ _ f1).
  - unfold Imp.
    unfold Or.


Lemma gqm_impE : forall G f1 f2, GQMded G f1 -> GQMded G (f1 ->> f2) -> GQMded G f2.
Proof.
  move => G f1.
  elim: f1 G.
  - move => x G f2 Hvar Himp.
    inversion Himp; subst.
  elim: Himp.

Lemma gqm_impI : forall G f1 f2, GQMded (f1 :: G) f2 -> GQMded G (f1 ->> f2).
Proof.
  move => G f1 f2.
  elim.