/machines/1RB1LF_0RC0RB_0LD1LA_1LC0LE_0LA---_1LA1LF/rocq/t2.v · raw
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 | From BusyCoq Require Import Individual62. Require Import ZifyNat Lia. Require Import ZArith. Require Import String. Open Scope list. Definition tm := Eval compute in (TM_from_str "1RB1LF_0RC0RB_0LD1LA_1LC0LE_0LA---_1LA1LF"). Notation "c -->* c'" := (c -[ tm ]->* c') (at level 40). Notation "c -->+ c'" := (c -[ tm ]->+ c') (at level 40). Definition R n m := [1] *> [1;0]^^(1+n) *> [0] *> [1;0]^^(m) *> const 0. (** ** Words W(e,o): bit d of e on cell 2d, bit d of o on cell 2d+1 (cell 0 is read by A) *) Definition bt (x:nat) : Sym := if Nat.odd x then 1 else 0. Fixpoint wd (n e o : nat) : list Sym := match n with | O => [] | S n' => bt e :: bt o :: wd n' (Nat.div2 e) (Nat.div2 o) end. Definition WS e o : side := wd (e+o) e o *> const 0. Lemma bt_even e: bt (2*e) = 0. Proof. unfold bt. rewrite Nat.odd_even. reflexivity. Qed. Lemma bt_odd e: bt (2*e+1) = 1. Proof. unfold bt. rewrite Nat.odd_odd. reflexivity. Qed. Lemma div2_even e: Nat.div2 (2*e) = e. Proof. apply Nat.div2_double. Qed. Lemma div2_odd e: Nat.div2 (2*e+1) = e. Proof. rewrite Nat.add_1_r. apply Nat.div2_succ_double. Qed. Lemma wd_pad n: forall e o k, e < 2^n -> o < 2^n -> wd (n+k) e o *> const 0 = wd n e o *> const 0. Proof. induction n; intros e o k He Ho. - cbn in He,Ho. assert (e=0)%nat by lia. assert (o=0)%nat by lia. subst. cbn. induction k. + reflexivity. + change (wd (S k) 0 0) with (0 :: 0 :: wd k 0 0). cbn [Str_app]. rewrite IHk. rewrite <-!const_unfold. reflexivity. - cbn [wd Nat.add Str_app]. f_equal. f_equal. apply IHn. + rewrite Nat.div2_div. cbn in He. apply Nat.Div0.div_lt_upper_bound; lia. + rewrite Nat.div2_div. cbn in Ho. apply Nat.Div0.div_lt_upper_bound; lia. Qed. Lemma lt_pow2_self x: x < 2^x. Proof. apply Nat.pow_gt_lin_r. lia. Qed. Lemma wd_WS n e o: e < 2^n -> o < 2^n -> wd n e o *> const 0 = WS e o. Proof. intros He Ho. unfold WS. assert (e < 2^(e+o)). { pose proof (lt_pow2_self (e+o)). pose proof (Nat.pow_le_mono_r 2 e (e+o)). lia. } assert (o < 2^(e+o)). { pose proof (lt_pow2_self (e+o)). lia. } destruct (Nat.le_ge_cases n (e+o)) as [H1|H1]. - replace (e+o) with (n+(e+o-n)) by lia. rewrite wd_pad; auto. - replace n with ((e+o)+(n-(e+o))) by lia. rewrite wd_pad; auto. Qed. Lemma WS_split e o: WS e o = [bt e; bt o] *> WS (Nat.div2 e) (Nat.div2 o). Proof. rewrite <-(wd_WS (S (e+o)) e o). 2,3: pose proof (lt_pow2_self (e+o)); pose proof (Nat.pow_le_mono_r 2 (e+o) (S (e+o))); lia. cbn [wd Str_app]. rewrite (wd_WS (e+o)). 1: reflexivity. - rewrite Nat.div2_div. apply Nat.Div0.div_lt_upper_bound. pose proof (lt_pow2_self (e+o)). rewrite <-Nat.pow_succ_r'. pose proof (Nat.pow_le_mono_r 2 (e+o) (S (e+o))). lia. - rewrite Nat.div2_div. apply Nat.Div0.div_lt_upper_bound. pose proof (lt_pow2_self (e+o)). rewrite <-Nat.pow_succ_r'. pose proof (Nat.pow_le_mono_r 2 (e+o) (S (e+o))). lia. Qed. Lemma WS_00 e o: WS (2*e) (2*o) = [0;0] *> WS e o. Proof. rewrite WS_split, bt_even, bt_even, div2_even, div2_even. reflexivity. Qed. Lemma WS_10 e o: WS (2*e+1) (2*o) = [1;0] *> WS e o. Proof. rewrite WS_split, bt_even, bt_odd, div2_even, div2_odd. reflexivity. Qed. Lemma WS_01 e o: WS (2*e) (2*o+1) = [0;1] *> WS e o. Proof. rewrite WS_split, bt_even, bt_odd, div2_even, div2_odd. reflexivity. Qed. Lemma WS_11 e o: WS (2*e+1) (2*o+1) = [1;1] *> WS e o. Proof. rewrite WS_split, bt_odd, bt_odd, div2_odd, div2_odd. reflexivity. Qed. Lemma WS_0x e o: WS (2*e) o = [0; bt o] *> WS e (Nat.div2 o). Proof. rewrite WS_split, bt_even, div2_even. reflexivity. Qed. Lemma WS_1x e o: WS (2*e+1) o = [1; bt o] *> WS e (Nat.div2 o). Proof. rewrite WS_split, bt_odd, div2_odd. reflexivity. Qed. (** ** The left step phi, as a relation (A scanning an E-cell / F scanning an E-cell) *) Inductive PA : nat -> nat -> nat -> nat -> Prop := | PA0 e o : PA (2*e) o (2*e+1) o | PA1 e o e' o' : PA e o e' o' -> PA (2*e+1) (2*o) (2*e') (2*o') | PA2 e o e' o' : PF e o e' o' -> PA (2*e+1) (2*o+1) (2*e') (2*o') with PF : nat -> nat -> nat -> nat -> Prop := | PF0 e o : PF (2*e) (2*o) (2*e) (2*o+1) | PF1 e o e' o' : PF e o e' o' -> PF (2*e) (2*o+1) (2*e') (2*o') | PF2 e o e' o' : PA e o e' o' -> PF (2*e+1) (2*o) (2*e') (2*o') | PF3 e o e' o' : PF e o e' o' -> PF (2*e+1) (2*o+1) (2*e') (2*o'). Scheme PA_mind := Induction for PA Sort Prop with PF_mind := Induction for PF Sort Prop. Combined Scheme PAF_mind from PA_mind, PF_mind. Lemma TA0 l a r: [0;a] *> l <{{A}} r -->+ [1;a] *> l {{B}}> r. Proof. es. Qed. Lemma TA1 l r: [1;0] *> l <{{A}} r -->+ l <{{A}} [1;1] *> r. Proof. es. Qed. Lemma TA2 l r: [1;1] *> l <{{A}} r -->+ l <{{F}} [1;1] *> r. Proof. es. Qed. Lemma TF0 l r: [0;0] *> l <{{F}} r -->+ [0;1] *> l {{B}}> r. Proof. es. Qed. Lemma TF1 l r: [0;1] *> l <{{F}} r -->+ l <{{F}} [1;1] *> r. Proof. es. Qed. Lemma TF2 l r: [1;0] *> l <{{F}} r -->+ l <{{A}} [1;1] *> r. Proof. es. Qed. Lemma TF3 l r: [1;1] *> l <{{F}} r -->+ l <{{F}} [1;1] *> r. Proof. es. Qed. Lemma TB l r: l {{B}}> [1;1] *> r -->+ [0;0] *> l {{B}}> r. Proof. es. Qed. Lemma phi_spec: (forall e o e' o', PA e o e' o' -> forall r, WS e o <{{A}} r -->+ WS e' o' {{B}}> r) /\ (forall e o e' o', PF e o e' o' -> forall r, WS e o <{{F}} r -->+ WS e' o' {{B}}> r). Proof. apply PAF_mind. all: intros. all: try (rewrite WS_0x, WS_1x; apply TA0). all: try (rewrite WS_10, WS_00; eapply progress_trans; [apply TA1|]; eapply progress_trans; [apply H|]; apply TB). all: try (rewrite WS_11, WS_00; eapply progress_trans; [apply TA2|]; eapply progress_trans; [apply H|]; apply TB). all: try (rewrite WS_00, WS_01; apply TF0). all: try (rewrite WS_01, WS_00; eapply progress_trans; [apply TF1|]; eapply progress_trans; [apply H|]; apply TB). all: try (rewrite WS_10, WS_00; eapply progress_trans; [apply TF2|]; eapply progress_trans; [apply H|]; apply TB). all: try (rewrite WS_11, WS_00; eapply progress_trans; [apply TF3|]; eapply progress_trans; [apply H|]; apply TB). Qed. Definition PA_spec := proj1 phi_spec. (** ** The right step and the overflows *) Lemma RS l n m: l {{B}}> R (S n) m -->+ l <{{A}} R n (S m). Proof. unfold R. es. Qed. Lemma shift01 u (r:side): [0;1]^^u *> [0] *> r = [0] *> [1;0]^^u *> r. Proof. induction u. - reflexivity. - cbn [lpow]. rewrite !Str_app_assoc. rewrite IHu. reflexivity. Qed. Lemma OVe l u m: ([0;0]^^u *> [1] *> l) {{B}}> R 0 m -->+ l <{{A}} R (1+u+m) 0. Proof. unfold R. es. Qed. Lemma OVo l u m: ([0;0]^^u *> [0;1;0;0] *> l) {{B}}> R 0 m -->+ l <{{A}} R 0 (u+2+m). Proof. unfold R. es. Qed. Definition K e o n m := WS e o <{{A}} R n m. Lemma init0: c0 -->* K 1 0 0 1. Proof. unfold K. replace (WS 1 0) with ([1] *> const 0). 2: { unfold WS. cbn. rewrite <-const_unfold. reflexivity. } unfold R. esx. Qed. |