Все модули NZ
содержат аксиоматизацию . Они определяют свойства таких функций, как pow
, фактически не определяя их. Они делают это, используя Module
s. A Module
- это набор определений, обозначений и т.д. c., А также имен и типов этих определений и c. форма Module Type
. Вы можете «открыть» Module
и использовать все, что находится внутри, Import
, но для этого вам нужно иметь модуль правильного типа в первую очередь.
Pow A
- это тип реализации pow : A -> A -> A
, а PowNotation
- это тип модулей, которые содержат обозначение Infix "^" := pow
. Если у вас есть Module
с типом (или супертипом!) PowNotation
, вы можете Import
этот модуль, чтобы получить эту нотацию. Но, опять же, поскольку модули NZ
являются просто аксиоматизацией, они не предоставляют вам такой модуль, и поэтому вы не импортировали ничего, что дает вам эту нотацию. Вы можете напрямую импортировать фактическую реализацию:
Require Import PeanoNat.
(* The module Nat has type Pow nat, witnessed by Nat.pow : nat -> nat -> nat
however, it does not have type Pow' nat, so it doesn't actually contain
Infix "^" := pow.
The "^" notation is just coming from PeanoNat itself. *)
Definition func (a b : nat) : nat := a+b*2^a.
Или вы можете абстрагироваться от используемой системы счисления (так что это может быть унарный nat
s, или двоичные натуральные числа, или целые числа или целые числа образуют некоторое число, et c.), точно так же, как все модули NZ
абстрагируются по системе счисления:
Require Import NZAxioms.
Require Import NZPow.
Module Type NZFunc (Import A : Typ) (Import OT : OneTwo' A) (Import ASM : AddSubMul' A) (Import P : Pow' A).
Definition func (a b : t) : t := a+b*2^a.
(* t means A.t, and can be many things depending on the final implementation of this module type *)
(* 2 comes from OT, + from ASM, and ^ from P *)
End NZFunc.