Proof: Difference between revisions

887 bytes added ,  2 years ago
Line 225:
 
 
<lang ATS>(* Let us do a little of the formal logicquasi-math in ATS, even though this is NOT an
NOT an intended use of the facilities. However, I DO consider the task a
task a good didactic exercise. *)
 
 
Line 241:
propdef ODD (i : int) = NATURAL ((2 * i) + 1)
 
(* To construct a number. *)
(* 2.1 Define addition constructively (as a total function). *)
 
(* Let us define addition as the triple
(NATURAL i, NATURAL j, NATURAL (i + j)) *)
prfn
additionmake_natural {i, j : nat} () :<prf> NATURAL i =
(NATURAL i, NATURAL j, NATURAL (i + j)) =
let
prfun
addloop {i, jk : nat | k <= i} .<i - k>.
{k (partial_num : nat |NATURAL k) :<= j} .<j - kprf>.
(partial_sum : NATURAL (i + k)) :<prf> NATURAL (i + j) =
sif k == ji then
partial_sumpartial_num
else
add {i, j} {k + 1}loop (S partial_sumpartial_num)
in
loop (ZERO ())
end
 
prfn
make_even {i : nat} () :<prf> EVEN i =
make_natural {2 * i} ()
 
prfn
make_odd {i : nat} () :<prf> ODD i =
make_natural {(2 * i) + 1} ()
 
(* 2.1 Define addition constructively (as a total function). *)
 
prfn
addition {i, j : nat}
(i : NATURAL i,
(NATURAL i, j : NATURAL j,) :<prf> NATURAL (i + j)) =
let
prfun
add {k : nat | k <= j} .<j - k>.
(partial_sum : NATURAL (i + k),
shrinking : NATURAL (j - k)) :<prf>
NATURAL (i + j) =
case+ shrinking of
| ZERO () => partial_sum
| S (even_smaller) =>
add {k + 1} (S partial_sum, even_smaller)
 
prval isum = add {0, i} {0} (ZEROi, ()j)
prval j = add {0, j} {0} (ZERO ())
prval sum = add {i, j} {0} i
in
(i, j, sum)
end
 
prfn
addition_relation {i, j : nat} () :<prf>
(NATURAL i, NATURAL j, NATURAL (i + j)) *)=
let
prval i = make_natural {i} ()
prval j = make_natural {j} ()
in
(i, j, addition (i, j))
end
 
Line 270 ⟶ 302:
sum_of_evens {i, j : nat} () :<prf>
(EVEN i, EVEN j, EVEN (i + j)) =
additionaddition_relation {2 * i, 2 * j} ()
 
(* or *)
 
prfn
sum_of_evens2 {i, j : nat} () :<prf>
(EVEN i, EVEN j, EVEN (i + j)) =
let
prval sumi = addmake_even {i, j} {0} i()
prval j = addmake_even {0, j} {0} (ZERO ())
in
(i, j, addition (i, j))
end
 
(* 3.2 Prove addition is associative. *)
Line 278 ⟶ 322:
((NATURAL (i + j), NATURAL k, NATURAL (i + j + k)),
(NATURAL i, NATURAL (j + k), NATURAL (i + j + k))) =
(additionaddition_relation {i + j, k} (),
additionaddition_relation {i, j + k} ())
 
 
(* 3.3 Prove addition is commutative. *)
Line 287 ⟶ 332:
((NATURAL i, NATURAL j, NATURAL (i + j)),
(NATURAL j, NATURAL i, NATURAL (i + j))) =
(additionaddition_relation {i, j} (),
additionaddition_relation {j, i} ())
 
(* 3.4 Try to prove the sum of two evens is odd. *)
Line 297 ⟶ 342:
sum_of_evens_is_odd {i, j : nat} () :<prf>
(EVEN i, EVEN j, ODD (i + j)) =
(additionaddition_relation {i, j} (),
additionaddition_relation {j, i} ())
#endif
 
Line 308 ⟶ 353:
function here, but ATS is not really made for doing
mathematical logic. It is a systems programming language, with
some limited proof capability included as a programming aid. *)
If suddenly a better approach occurs to me, I might substitute
it. *)
[k : nat | k mod 2 <> 1]
(EVEN i, EVEN j, NATURAL k) =
additionaddition_relation {2 * i, 2 * j} ()
 
(* 4.2 Try to prove the sum of evens is not even. *)
Line 321 ⟶ 368:
[k : nat | k mod 2 <> 0]
(EVEN i, EVEN j, NATURAL k) =
additionaddition_relation {2 * i, 2 * j} ()
#endif
 
1,448

edits