A module can import other modules. In the importing module, elements declared in the imported module can be used.
There are three kinds of import declarations: protecting, extending and using (or just pr, ex and us):
pr(<module-exp>)
ex(<module-exp>)
us(<module-exp>)
The name of a module to be imported is written in <module-exp>.
Each of pr, ex and us states to what extent the intended models of the imported modules are preserved within those of the importing modules.
pr : does not allow elements to be added and collapsed.ex : allows elements to be added but does not allowed to be collapsed.us : allows total destruction.When importing NAT+ with ex, A new element nan can be added to Nat, however it is not allowed when the import mode is pr:
mod! NAT+NAN {
ex(NAT+)
op nan : -> Nat
}When importing NAT+ with us, Terms s(s(s(s(s(s(s(s(s(s(s(s(0)))))))))))) (=12) and 0 are allowed to be a same element. Then, a specification of arithmetic modulo 12 is obtained (*). This is not allowed when importing modules with pr or ex.
(*) In HOUR12, it holds that not only 12 = 0 but also 13 = 1, 14 = 2, and so on.
mod! HOUR12 {
us(NAT+)
eq s(s(s(s(s(s(s(s(s(s(s(s(0)))))))))))) = 0 .
}Original Copyright © Takahiro Seino, all rights reserved.