Documentation tweaks

This commit is contained in:
Rob Dockins 2020-05-27 14:21:17 -07:00
parent d816d8820a
commit 542debdb67
8 changed files with 57 additions and 20 deletions

View File

@ -13,7 +13,7 @@
modulus methods (`(/)` and `(%)`), and the sequence indexing, modulus methods (`(/)` and `(%)`), and the sequence indexing,
sequence update and shifting operations are generalized over sequence update and shifting operations are generalized over
`Integral`. The `toInteger` operation is also generalized over this `Integral`. The `toInteger` operation is also generalized over this
class. `Integral` contains the bitvector types, `Integer` and `Z n`. class. `Integral` contains the bitvector types and `Integer`.
The new `Field` class contains types representing mathematical The new `Field` class contains types representing mathematical
fields (or types that are approximately fields). For now, it is fields (or types that are approximately fields). For now, it is
@ -25,13 +25,15 @@
There is also a new `Round` class for types that can sensibly be There is also a new `Round` class for types that can sensibly be
rounded to integers. This class has the methods `floor`, `ceiling`, rounded to integers. This class has the methods `floor`, `ceiling`,
`trunc` and `round` for performing different kinds of `trunc` and `round` for performing different kinds of
integer rounding. integer rounding. Currently `Rational` is the only meber of `Round`.
Finally the `(^^)`, `lg2`, `(/$)` and `(%$)` methods of Arith have The type of `(^^)` is modified to be
had their types specialized. `lg2` is now only an operation on `{a, e} (Ring a, Integral e) => a -> e -> a`. This makes it clear
bitvectors, and the exponent of `(^^)` is specialized to be a that the semantics are iterated multiplication, which makes sense
bitvector. Likewise, `(/$)` and `(%$)` are now operations in any ring.
only on bitvectors.
Finally, the `lg2`, `(/$)` and `(%$)` methods of Arith have
had their types specialized so operate only on bitvectors.
* Added a base `Rational` type. It is implemented as a pair of * Added a base `Rational` type. It is implemented as a pair of
integers, quotiented in the usual way. As such, it reduces to the integers, quotiented in the usual way. As such, it reduces to the

View File

@ -20,6 +20,7 @@ Comparisons and Ordering
instance (Cmp a, Cmp b) => Cmp (a, b) instance (Cmp a, Cmp b) => Cmp (a, b)
instance (Cmp a, Cmp b) => Cmp { x : a, y : b } instance (Cmp a, Cmp b) => Cmp { x : a, y : b }
instance Cmp Integer instance Cmp Integer
instance (fin n, n>=1) => Cmp (Z n)
instance Cmp Rational instance Cmp Rational
Signed Comparisons Signed Comparisons
@ -38,6 +39,13 @@ Signed Comparisons
instance (SignedCmp a, SignedCmp b) => SignedCmp (a, b) instance (SignedCmp a, SignedCmp b) => SignedCmp (a, b)
instance (SignedCmp a, SignedCmp b) => SignedCmp { x : a, y : b } instance (SignedCmp a, SignedCmp b) => SignedCmp { x : a, y : b }
Zero
----
zero : {a} (Zero a) => a
Every base and structured type in Cryptol is a member of class `Zero`.
Arithmetic Arithmetic
---------- ----------
@ -58,7 +66,8 @@ Arithmetic
trunc : {a} (Round a) => a -> Integer trunc : {a} (Round a) => a -> Integer
round : {a} (Round a) => a -> Integer round : {a} (Round a) => a -> Integer
(^^) : {a, n} (Ring a, fin n) => a -> [n] -> a (^^) : {a, e} (Ring a, Integral e) => a -> e -> a
(/$) : {n} (fin n, n >= 1) => [n] -> [n] -> [n] (/$) : {n} (fin n, n >= 1) => [n] -> [n] -> [n]
(%$) : {n} (fin n, n >= 1) => [n] -> [n] -> [n] (%$) : {n} (fin n, n >= 1) => [n] -> [n] -> [n]
lg2 : {n} (fin n) => [n] -> [n] lg2 : {n} (fin n) => [n] -> [n]
@ -80,7 +89,6 @@ the top two instances do not actually overlap.
instance Integral Integer instance Integral Integer
instance (fin n) => Integral ([n]Bit) instance (fin n) => Integral ([n]Bit)
instance (fin n, n>=1) => Integral (Z n)
instance Field Rational instance Field Rational
@ -92,7 +100,6 @@ Boolean
False : Bit False : Bit
True : Bit True : Bit
zero : {a} (Zero a) => a
(&&) : {a} (Logic a) => a -> a -> a (&&) : {a} (Logic a) => a -> a -> a
(||) : {a} (Logic a) => a -> a -> a (||) : {a} (Logic a) => a -> a -> a
(^) : {a} (Logic a) => a -> a -> a (^) : {a} (Logic a) => a -> a -> a
@ -108,6 +115,8 @@ Boolean
instance (Logic a, Logic b) => Logic (a, b) instance (Logic a, Logic b) => Logic (a, b)
instance (Logic a, Logic b) => Logic { x : a, y : b } instance (Logic a, Logic b) => Logic { x : a, y : b }
// No instance for `Logic Integer`. // No instance for `Logic Integer`.
// No instance for `Logic (Z n)`.
// No instance for `Logic Rational`.
Sequences Sequences
--------- ---------

View File

@ -283,7 +283,7 @@ value representing one half:
Note, the division operation on \texttt{Rational} is Note, the division operation on \texttt{Rational} is
written \texttt{/.}, and should not be confused with written \texttt{/.}, and should not be confused with
\texttt{/}, which is the division operation on for words \texttt{/}, which is the division operation for words
and integers. and integers.
@ -2984,11 +2984,11 @@ The sequence indexing, update and shifting operations
take index arguments that can be of any \texttt{Integral} type. take index arguments that can be of any \texttt{Integral} type.
Infinite sequence enumerations \texttt{[x ...]} Infinite sequence enumerations \texttt{[x ...]}
and \texttt{[x, y ...]} are also defined for class \texttt{Integral}. and \texttt{[x, y ...]} are also defined for class \texttt{Integral}.
Bitvectors, integers, and moduluar integers are members of \texttt{Integral}. Bitvectors and integers members of \texttt{Integral}.
\item \item
The \texttt{Field} typeclass represents values that, in addition to The \texttt{Field} typeclass represents values that, in addition to
being a \texttt{Ring} posess a multiplictive inverses. being a \texttt{Ring}, have multiplictive inverses.
It includes the field division operation \texttt{/.} and the It includes the field division operation \texttt{/.} and the
\texttt{recip} operation for computing the reciprocol of a value. \texttt{recip} operation for computing the reciprocol of a value.
Currently, only type \texttt{Rational} is a member of this class. Currently, only type \texttt{Rational} is a member of this class.

View File

@ -64,7 +64,8 @@ expressed (more concisely) using the \texttt{===} operator:
\note{It is important to emphasize that the mathematical equality \note{It is important to emphasize that the mathematical equality
above and the Cryptol property are \emph{not} stating precisely the above and the Cryptol property are \emph{not} stating precisely the
same property. Remember that all Cryptol arithmetic is same property. Remember that Cryptol arithmetic depends on the
types of the arguments and arithmetic on \texttt{[8]} is
modular,\indModular while the mathematical equation is over modular,\indModular while the mathematical equation is over
arbitrary numbers, including negative, real, or even complex arbitrary numbers, including negative, real, or even complex
numbers. The takeaway of this discussion is that we are only using numbers. The takeaway of this discussion is that we are only using

View File

@ -26,7 +26,7 @@ primsPlaceHolder=1;
+, -, * : {a} (Ring a) => a -> a -> a +, -, * : {a} (Ring a) => a -> a -> a
negate : {a} (Ring a) => a -> a negate : {a} (Ring a) => a -> a
fromInteger : {a} (Ring a) => Integer -> a fromInteger : {a} (Ring a) => Integer -> a
^^ : {a} (Ring a, fin n) => a -> [n] -> a ^^ : {a, e} (Ring a, Integral e) => a -> e -> a
abs : {a} (Cmp a, Ring a) => a -> a abs : {a} (Cmp a, Ring a) => a -> a
/, % : {a} (Integral a) => a -> a -> a /, % : {a} (Integral a) => a -> a -> a
toInteger : {a} (Integral a) => a -> Integer toInteger : {a} (Integral a) => a -> Integer

View File

@ -29,10 +29,31 @@ primitive type Bit : *
/** The type of unbounded integers. */ /** The type of unbounded integers. */
primitive type Integer : * primitive type Integer : *
/** 'Z n' is the type of integers, modulo 'n'. */ /** 'Z n' is the type of integers, modulo 'n'.
*
* The values of `Z n` may be thought of as equivalance
* classes of integers according to the equivalence
* `x ~ y` iff `n` divides `x - y`. `Z n` naturally
* forms a ring, but does not support integral division
* or indexing.
*
* However, you may use the `fromZ` operation
* to project values in `Z n` into the integers if such operations
* are required. This will compute the reduced representative
* of the equivalance class. In other words, `fromZ` computes
* the (unique) integer value `i` where `0 <= i < n` and
* `i` is in the given equivalance class.
*/
primitive type {n : #} (fin n, n >= 1) => Z n : * primitive type {n : #} (fin n, n >= 1) => Z n : *
/** `Rational` is the type of rational numbers. */ /** `Rational` is the type of rational numbers.
* Rational numbers form a Field (and thus a Ring).
*
* The `ratio` operation may be used to directly create
* rational values from as a ratio of integers, or
* the `fromInteger` method and the field operations
* can be used.
*/
primitive type Rational : * primitive type Rational : *
type Bool = Bit type Bool = Bit
@ -293,7 +314,10 @@ primitive toInteger : {a} (Integral a) => a -> Integer
/** /**
* Compute the exponentiation of a value in a ring. * Compute the exponentiation of a value in a ring.
* The exponent is treated as an unsigned bitvector value. * * For type [n], the exponent is treated as unsigned.
* * It is an error to raise a value to a negative integer exponent.
* * Satisfies: `x ^^ 0 == fromInteger 1`
* * Satisfies: `x ^^ e == x * x ^^ (e-1)` when `e > 0`.
*/ */
primitive (^^) : {a, e} (Ring a, Integral e) => a -> e -> a primitive (^^) : {a, e} (Ring a, Integral e) => a -> e -> a

View File

@ -63,7 +63,7 @@ The value types of Cryptol, along with their Haskell representations,
are as follows: are as follows:
| Cryptol type | Description | `TValue` representation | | Cryptol type | Description | `TValue` representation |
|:----------------- |:-------------- ---|:--------------------------- | |:------------------|:------------------|:----------------------------|
| `Bit` | booleans | `TVBit` | | `Bit` | booleans | `TVBit` |
| `Integer` | integers | `TVInteger` | | `Integer` | integers | `TVInteger` |
| `Z n` | integers modulo n | `TVIntMod n` | | `Z n` | integers modulo n | `TVIntMod n` |
@ -856,7 +856,7 @@ For functions, `zero` returns the constant function that returns
Literals Literals
-------- --------
Given a literal integer, construct a value of a type that can represent that literal Given a literal integer, construct a value of a type that can represent that literal.
> literal :: Integer -> TValue -> Value > literal :: Integer -> TValue -> Value
> literal i = go > literal i = go

View File

@ -19,6 +19,7 @@ import Data.ByteString(ByteString)
import qualified Data.ByteString.Char8 as B import qualified Data.ByteString.Char8 as B
import Text.Heredoc (there) import Text.Heredoc (there)
preludeContents :: ByteString preludeContents :: ByteString
preludeContents = B.pack [there|lib/Cryptol.cry|] preludeContents = B.pack [there|lib/Cryptol.cry|]