On Thu, 24 Nov 2011, Brian Huffman wrote:
I have been working on a new numeral representation for Isabelle
recently, and I would like to share it with everyone. An overview of the
design is now available on the Isanotes wiki [1]; a patched version of
the Isabelle hg repo is also available [2].
[1] https://isabelle.in.tum.de/isanotes/index.php/Numerals
[2] http://www4.in.tum.de/~huffman/cgi-bin/repos.cgi/numerals
This looks generally quite good to me. The big initial change is not so
complicated for such a substantial reform after so many years. (In 1999
I've assisted Larry in doing the original version of numerals, but of
course I cannot claim any special expertise on the subject anymore.)
datatype bin = One | Bit0 bin | Bit1 bin
class numeral = semigroup_add + one
primrec (in numeral) numeral :: "bin => 'a" where
"numeral One = 1" |
"numeral (Bit0 k) = numeral k + numeral k" |
"numeral (Bit1 k) = numeral k + numeral k + 1"
class neg_numeral = group_add + one
definition (in neg_numeral) neg_numeral :: "bin => 'a" where
"neg_numeral k = - numeral k"
Is there a conceptual point for neg_numeral, beyond concrete syntax
issues?
One could just use regular uminus, but then there will be an accidental
change in concrete syntax: -42 and - 42 would be the same, both with the
weaker priority of unary minus.
Some notes also about the wiki material:
Named "bin" after the old binary type Int.bin, which merged with type
"int" a few years ago. Other sensible choices for the type name would be
"num" (as used in ex/Numeral.thy) or "pos" for "positive" numbers (as
used in the Coq standard libraries). Perhaps "pos" would make the most
sense if we decide to support this as a user-visible abstract semiring
type. The type name "num" has an unfortunate clash with the global
grammar terminal of the same name, which causes the type name "num" to
be always printed with a qualifier.
I was at first confused about "pos", since it is a concrete datatype.
But here it really seems to be an isomorphic copy of positive natural
numbers, without the former redundancy of leading 0s.
You can also have "num", since the one in Pure is hardly ever used as
such, only the derived form "num_const". We already have "float_token"
vs. "fload_const", so it would make sense to rename Pure "num" to
"num_token" to get it out of the way.
BTW, there are some other "num" types defined in some user theories, but
that should not be a decisive point.
The numeral "2" always means "1 + 1", "3" always means "1 + 1 + 1", etc.
Because there is a single, fixed definition for the meaning of numerals,
we can now prove theorems like "1 + 2 = 3" without needing any
additional type annotations.
Great! No longer this odd problem that the system cannot even prove
"1 + 1 = 2" due to unexpectedly general types.
Broken proof methods
sos_cert
some uses in Library/Sum_of_Squares.thy
BTW the regular "sos" method with the server communication is broken for
some months already. It would be nice if someone could volunteer to
recover this nice student project of Philipp Meyer.
Makarius
_______________________________________________
isabelle-dev mailing list
[email protected]
https://mailmanbroy.informatik.tu-muenchen.de/mailman/listinfo/isabelle-dev