Library Icharate.Meta.unaries
Require Export natDed.
Require Export struct_props.
Require Export ZArith.
Require Export ZArithRing.
Set Implicit Arguments.
Section unaries.
Variables I J A W:Set.
Variables (decI:eqdec I) (decJ:eqdec J).
Fixpoint diffDiamBox(j:J) (f:Form I J A){struct f}:Z:=
match f with
| At a => 0%Z
| Dot i1 C B => (diffDiamBox j C + diffDiamBox j B)%Z
| Slash i1 C B => (diffDiamBox j C - diffDiamBox j B)%Z
| Backslash i1 B C => (diffDiamBox j C - diffDiamBox j B)%Z
| Box i1 C =>match (decJ i1 j) with
|left _=> (diffDiamBox j C - 1%Z)%Z
|right _ =>diffDiamBox j C
end
| Diamond i1 C =>match (decJ i1 j) with
|left _=> (diffDiamBox j C + 1%Z)%Z
|right _ => diffDiamBox j C
end
end.
Fixpoint diffDBTerm (j:J)(t:context I J A W){struct t}:Z:=
match t with
| res _ F => diffDiamBox j F
| Comma i1 T1 T2 => ( diffDBTerm j T1 + diffDBTerm j T2)%Z
| TDiamond i1 T1 =>match (decJ i1 j) with
|left _ => (diffDBTerm j T1 + 1%Z)%Z
|right _ =>diffDBTerm j T1
end
end.
Fixpoint sum_diff_leaves (j:J)(t:context I J A W){struct t}:Z:=
match t with
| res _ F => diffDiamBox j F
| Comma i1 T1 T2 => (sum_diff_leaves j T1 + sum_diff_leaves j T2)%Z
| TDiamond i1 T1 => sum_diff_leaves j T1
end.
Lemma replaceDB:forall (T1 T2 T3 T4:context I J A W)(j:J),
replace T3 T4 T1 T2->
diffDBTerm j T3=diffDBTerm j T4 ->
diffDBTerm j T2 =diffDBTerm j T1.
Proof.
intros T1 T2 T3 T4 j H0.
induction H0.
auto.
simpl in |- *.
intros.
auto with zarith.
simpl in |- *; intro; auto with zarith.
simpl in |- *.
case (decJ j0 j).
intros; auto with zarith.
auto.
Qed.
Definition condStruct(ru:structrule I J):=
forall T1 T2 j, apply_rule ru decI decJ T1 =Some T2 ->
diffDBTerm j T1=diffDBTerm j T2.
Definition condExt (ext :(extension I J )):=
forall Ru, in_extension Ru ext ->
condStruct Ru.
Lemma structRepDB: forall (T1 T2 T3 T4:context I J A W)j(ext :extension I J)Ru,
condExt ext->
in_extension Ru ext->
struct_replace decI decJ Ru T1 T2 T3 T4->
diffDBTerm j T3=diffDBTerm j T4.
Proof.
induction 3.
unfold condExt, condStruct in H;eapply H; eauto.
simpl;auto with zarith.
simpl in |- *; auto with zarith.
simpl in |- *;case (decJ j0 j);intro; auto with zarith.
Qed.
Theorem eqDiffDiamBox:forall (Gamma:context I J A W)(F:Form I J A)j
(ext :extension I J),
condExt ext ->
natded decI decJ ext Gamma F ->
(diffDBTerm j Gamma)=(diffDiamBox j F).
intros Gamma F j ext cond H0.
elim H0; simpl; intros; auto with zarith.
case (decJ j0 j); auto with zarith.
generalize H; case (decJ i j); intros; auto with zarith.
rewrite <- H2; eapply replaceDB;[eauto |simpl; auto with zarith].
rewrite <- H1; eapply replaceDB;[eauto |simpl; auto with zarith].
generalize H; case (decJ j0 j); intros; auto with zarith.
rewrite <- H; eapply structRepDB;eauto.
Qed.
Lemma eqDiffDB:forall (Gamma:context I J A W)(F:Form I J A)j
(ext :extension I J),
condExt ext ->
(diffDBTerm j Gamma)<>(diffDiamBox j F)->
natded decI decJ ext Gamma F ->
False.
intros.
elim H0.
eapply eqDiffDiamBox; eauto.
Qed.
Lemma linearTocondStruct:forall(ru:structrule I J),
linearDiam decJ ru ->
condStruct ru.
Admitted.
End unaries.
