438 |
438 |
439 (* nat *) |
439 (* nat *) |
440 |
440 |
441 val natT = Type ("nat", []); |
441 val natT = Type ("nat", []); |
442 |
442 |
443 val zero = Const ("HOL.zero_class.zero", natT); |
443 val zero = Const ("Algebras.zero_class.zero", natT); |
444 |
444 |
445 fun is_zero (Const ("HOL.zero_class.zero", _)) = true |
445 fun is_zero (Const ("Algebras.zero_class.zero", _)) = true |
446 | is_zero _ = false; |
446 | is_zero _ = false; |
447 |
447 |
448 fun mk_Suc t = Const ("Suc", natT --> natT) $ t; |
448 fun mk_Suc t = Const ("Suc", natT --> natT) $ t; |
449 |
449 |
450 fun dest_Suc (Const ("Suc", _) $ t) = t |
450 fun dest_Suc (Const ("Suc", _) $ t) = t |
456 let |
456 let |
457 fun mk 0 = zero |
457 fun mk 0 = zero |
458 | mk n = mk_Suc (mk (n - 1)); |
458 | mk n = mk_Suc (mk (n - 1)); |
459 in if n < 0 then raise TERM ("mk_nat: negative number", []) else mk n end; |
459 in if n < 0 then raise TERM ("mk_nat: negative number", []) else mk n end; |
460 |
460 |
461 fun dest_nat (Const ("HOL.zero_class.zero", _)) = 0 |
461 fun dest_nat (Const ("Algebras.zero_class.zero", _)) = 0 |
462 | dest_nat (Const ("Suc", _) $ t) = dest_nat t + 1 |
462 | dest_nat (Const ("Suc", _) $ t) = dest_nat t + 1 |
463 | dest_nat t = raise TERM ("dest_nat", [t]); |
463 | dest_nat t = raise TERM ("dest_nat", [t]); |
464 |
464 |
465 val class_size = "Nat.size"; |
465 val class_size = "Nat.size"; |
466 |
466 |
506 fun add_numerals (Const ("Int.number_class.number_of", Type (_, [_, T])) $ t) = cons (t, T) |
506 fun add_numerals (Const ("Int.number_class.number_of", Type (_, [_, T])) $ t) = cons (t, T) |
507 | add_numerals (t $ u) = add_numerals t #> add_numerals u |
507 | add_numerals (t $ u) = add_numerals t #> add_numerals u |
508 | add_numerals (Abs (_, _, t)) = add_numerals t |
508 | add_numerals (Abs (_, _, t)) = add_numerals t |
509 | add_numerals _ = I; |
509 | add_numerals _ = I; |
510 |
510 |
511 fun mk_number T 0 = Const ("HOL.zero_class.zero", T) |
511 fun mk_number T 0 = Const ("Algebras.zero_class.zero", T) |
512 | mk_number T 1 = Const ("HOL.one_class.one", T) |
512 | mk_number T 1 = Const ("Algebras.one_class.one", T) |
513 | mk_number T i = number_of_const T $ mk_numeral i; |
513 | mk_number T i = number_of_const T $ mk_numeral i; |
514 |
514 |
515 fun dest_number (Const ("HOL.zero_class.zero", T)) = (T, 0) |
515 fun dest_number (Const ("Algebras.zero_class.zero", T)) = (T, 0) |
516 | dest_number (Const ("HOL.one_class.one", T)) = (T, 1) |
516 | dest_number (Const ("Algebras.one_class.one", T)) = (T, 1) |
517 | dest_number (Const ("Int.number_class.number_of", Type ("fun", [_, T])) $ t) = |
517 | dest_number (Const ("Int.number_class.number_of", Type ("fun", [_, T])) $ t) = |
518 (T, dest_numeral t) |
518 (T, dest_numeral t) |
519 | dest_number t = raise TERM ("dest_number", [t]); |
519 | dest_number t = raise TERM ("dest_number", [t]); |
520 |
520 |
521 |
521 |