Exact expanded PA statement
forall d n q r Q R. (((n) = (d) * (q) + (r) /\ (exists bcf_lt_gap_bddqb_source_bound. bcf_lt_gap_bddqb_source_bound + S (r) = d))) -> (((n + n) = (d) * (Q) + (R) /\ (exists bcf_lt_gap_bddqb_double_bound. bcf_lt_gap_bddqb_double_bound + S (R) = d))) -> (Q = q + q \/ Q = S (q + q))Structural proof guide
Doubling a dividend changes its quotient by one binary carry.
Direct prerequisites: le_or_lt, le_eq_or_lt, lt_not_le, zero_le, one_le_of_ne_zero, add_shuffle_middle, mul_add, add_assoc, add_comm, add_lt_add, add_lt_cancel_left, division_remainder_unique. The authored body proceeds by case analysis (8), intermediate claims (12), equality transport (6).
Proof neighborhood
Direct dependencies
BT001G le_or_lt BT001C le_eq_or_lt BT001I lt_not_le BT000W zero_le BT0010 one_le_of_ne_zero BT00MY add_shuffle_middle BT0007 mul_add BT0003 add_assoc BT0002 add_comm BT00XB add_lt_add BT00XC add_lt_cancel_left BT001U division_remainder_uniqueDirect dependents
Formal native tactic body
Dependencies are hypotheses of this body receipt. The focused endpoint audits separately check the complete empty-context certificates.
- 0001
intro d - 0002
intro n - 0003
intro q - 0004
intro r - 0005
intro Q - 0006
intro R - 0007
intro hsource - 0008
intro hdouble - 0009
cases hsource - 0010
cases hdouble - 0011
have hdouble_eq : n + n = d * (q + q) + (r + r) - 0012
rewrite hsource_left - 0013
rewrite hsource_left - 0014
trans (d * q + d * q) + (r + r) - 0015
apply add_shuffle_middle - 0016
congr - 0017
symm - 0018
apply mul_add - 0019
refl - 0020
specialize le_or_lt (r + r) - 0021
specialize le_or_lt d - 0022
cases le_or_lt - 0023
have hsplit : r + r = d \/ exists k. k + S (r + r) = d - 0024
specialize le_eq_or_lt (r + r) - 0025
specialize le_eq_or_lt d - 0026
apply le_eq_or_lt - 0027
exact le_or_lt_left - 0028
cases hsplit - 0029
have hd0 : ~(d = 0) - 0030
intro hd - 0031
rewrite hd at hsource_right - 0032
specialize lt_not_le r - 0033
specialize lt_not_le 0 - 0034
apply lt_not_le - 0035
exact hsource_right - 0036
specialize zero_le r - 0037
exact zero_le - 0038
have hzero_bound : exists k. k + S 0 = d - 0039
specialize one_le_of_ne_zero d - 0040
apply one_le_of_ne_zero - 0041
exact hd0 - 0042
have hcandidate_eq : n + n = d * S (q + q) + 0 - 0043
trans d * (q + q) + (r + r) - 0044
exact hdouble_eq - 0045
rewrite hsplit_left - 0046
trans d * S (q + q) - 0047
symm - 0048
apply PA6 - 0049
symm - 0050
apply PA3 - 0051
have hunique : Q = S (q + q) /\ R = 0 - 0052
specialize division_remainder_unique d - 0053
specialize division_remainder_unique (n + n) - 0054
specialize division_remainder_unique Q - 0055
specialize division_remainder_unique R - 0056
specialize division_remainder_unique (S (q + q)) - 0057
specialize division_remainder_unique 0 - 0058
apply division_remainder_unique - 0059
exact hdouble_left - 0060
exact hdouble_right - 0061
exact hcandidate_eq - 0062
exact hzero_bound - 0063
cases hunique - 0064
right - 0065
exact hunique_left - 0066
have hunique : Q = q + q /\ R = r + r - 0067
specialize division_remainder_unique d - 0068
specialize division_remainder_unique (n + n) - 0069
specialize division_remainder_unique Q - 0070
specialize division_remainder_unique R - 0071
specialize division_remainder_unique (q + q) - 0072
specialize division_remainder_unique (r + r) - 0073
apply division_remainder_unique - 0074
exact hdouble_left - 0075
exact hdouble_right - 0076
exact hdouble_eq - 0077
exact hsplit_right - 0078
cases hunique - 0079
left - 0080
exact hunique_left - 0081
cases le_or_lt_right - 0082
have hrr : r + r = d + S x - 0083
trans x + S d - 0084
symm - 0085
exact le_or_lt_right_witness - 0086
trans S (x + d) - 0087
apply PA4 - 0088
trans S (d + x) - 0089
congr - 0090
apply add_comm - 0091
symm - 0092
apply PA4 - 0093
have hsum_lt : exists k. k + S (r + r) = d + d - 0094
specialize add_lt_add r - 0095
specialize add_lt_add d - 0096
specialize add_lt_add r - 0097
specialize add_lt_add d - 0098
apply add_lt_add - 0099
exact hsource_right - 0100
exact hsource_right - 0101
rewrite hrr at hsum_lt - 0102
have hcarry_bound : exists k. k + S (S x) = d - 0103
specialize add_lt_cancel_left d - 0104
specialize add_lt_cancel_left (S x) - 0105
specialize add_lt_cancel_left d - 0106
apply add_lt_cancel_left - 0107
exact hsum_lt - 0108
have hcandidate_eq : n + n = d * S (q + q) + S x - 0109
trans d * (q + q) + (r + r) - 0110
exact hdouble_eq - 0111
rewrite hrr - 0112
trans (d * (q + q) + d) + S x - 0113
symm - 0114
apply add_assoc - 0115
congr - 0116
symm - 0117
apply PA6 - 0118
refl - 0119
have hunique : Q = S (q + q) /\ R = S x - 0120
specialize division_remainder_unique d - 0121
specialize division_remainder_unique (n + n) - 0122
specialize division_remainder_unique Q - 0123
specialize division_remainder_unique R - 0124
specialize division_remainder_unique (S (q + q)) - 0125
specialize division_remainder_unique (S x) - 0126
apply division_remainder_unique - 0127
exact hdouble_left - 0128
exact hdouble_right - 0129
exact hcandidate_eq - 0130
exact hcarry_bound - 0131
cases hunique - 0132
right - 0133
exact hunique_left