Local Open Scope IPC_scope.
Section IPC.
Context {venv: Var_env}.
Inductive IPC_derive: Context -> Term -> Prop :=
| assum : forall ctx a, ctx a = true -> IPC_derive ctx a
| and_elim_l : forall ctx a b, IPC_derive ctx (a && b) -> IPC_derive ctx a
| and_elim_r : forall ctx a b, IPC_derive ctx (a && b) -> IPC_derive ctx b
| and_intro : forall ctx a b, IPC_derive ctx a -> IPC_derive ctx b -> IPC_derive ctx (a && b)
| or_elim : forall ctx a b c, IPC_derive ctx (a || b) ->
IPC_derive (ctx;;a) c -> IPC_derive (ctx;;b) c -> IPC_derive ctx c
| or_intro_l : forall ctx a b, IPC_derive ctx a -> IPC_derive ctx (a || b)
| or_intro_r : forall ctx a b, IPC_derive ctx b -> IPC_derive ctx (a || b)
| imp_elim : forall ctx a b, IPC_derive ctx a -> IPC_derive ctx (a --> b) -> IPC_derive ctx b
| imp_intro : forall ctx a b, IPC_derive (ctx;;a) b -> IPC_derive ctx (a --> b)
| false_elim : forall ctx a, IPC_derive ctx falsep -> IPC_derive ctx a.
Instance IPC : ProofTheory := mk_pt IPC_derive.

(* Specifications: *)
Lemma IPC_weakening: forall ctx1 ctx2 t,
(forall t0, ctx1 t0 = true -> ctx2 t0 = true) ->
ctx1 |-- t -> ctx2 |-- t.
Lemma IPC_substitution: forall ctx1 ctx2 t,
(forall t0, ctx2 t0 = true -> ctx1 |-- t0) ->
ctx2 |-- t ->
ctx1 |-- t.