Wiki

Clone wiki

CafeOBJ / OSEK / contents / index-e / 01_DataTypes

Data Types

NIL

#!python
module NIL
{
  signature
  {
    [Nil]
    op nil : -> Nil
  }
}

PROP

#!python
module PROP
{
  signature
  {
    [ Bool < Prop ]
    op _/\_ : Prop Prop -> Prop { assoc comm prec: 55 }
    op _\/_ : Prop Prop -> Prop { assoc comm prec: 59 }
    op neg_ : Prop -> Prop { prec: 53 }
    op _=>_ : Prop Prop -> Prop
    op _<=>_ : Prop Prop -> Prop
  }
  axioms
  {
    vars P Q R : Prop
    eq false /\ P = false .
    eq true /\ P = P .
    eq P /\ P = P .
    eq true \/ P = true .
    eq false \/ P = P .
    eq P \/ P = P .
    eq neg true = false .
    eq neg false = true .
    eq neg neg P = P .
    eq P => true = true .
    eq P => false = neg(P) .
    eq true => P = P .
    eq false => P = true .
    eq P => P = true .
    eq P <=> Q = (P => Q) /\ (Q => P) .
  }
}

NUMBER

#!python
module NUMBER
{
  signature
  {
    [ Number ]
    op 0 : -> Number
    op s_ : Number -> Number
  }
}

SET

#!python
module SET
(
  X :: TRIV
)
{
  imports
  {
    pr(NIL)
    ex(PROP)
    pr(NUMBER)
  }
  signature
  {
    [ Nil Elt < Set ]
    op _,_ : Set Set -> Set { assoc comm idem id: nil }
    op _@_ : Elt Set -> Prop
    op _\_ : Set Set -> Set
    op # : Set -> Number
  }
  axioms {
    vars X Y : Elt
    vars S T : Set
    eq (S,X = nil) = false .
    eq X @ nil = false .
    cq X @ (Y,S) = true
       if (X = Y) .
    cq X @ (Y,S) = X @ S
       if neg(X = Y) .
    eq nil \ S = nil .
    eq S \ nil = S .
    eq S \ (X,T) = (S \ X) \ T .
    eq (S,X) \ X = S .
    cq (S,Y) \ X = S \ X
       if (neg X = Y) .
    eq #(nil) = 0 .
    cq #(X,S) = s(#(S))
       if neg(X @ S) .
    cq #(X,S) = #(S)
       if (X @ S) .
  }
}

LIST

#!python
module LIST
(
  X :: TRIV
)
{
  imports
  {
    pr(NIL)
    pr(PROP)
    ex(NUMBER)
  }
  signature
  {
    [ Nil Elt < List ]
    op _;_ : List List -> List { assoc id: nil }
    op _@_ : Elt Nil -> Prop
    op _@_ : Elt Elt -> Prop
    op _@_ : Elt List -> Prop
    op _-_ : List Elt -> List
    op # : Nil -> Number
    op # : Elt -> Number
    op # : List -> Number
    op occur : List Elt -> Number
    op position : List Elt -> Number
  }
  axioms
  {
    vars X Y : Elt
    vars L F : List
    eq X @ nil =  false .
    cq X @ (Y;L) =  true
       if X = Y .
    cq X @ (Y;L) =  X @ L
       if neg(X = Y) .
    eq nil - X = nil .
    eq (X;L) - X = L .
    cq (Y;L) - X = Y;(L - X)
       if neg(X = Y) .
    eq #(nil) = 0 .
    eq #(L;X) = s(#(L)) .
    eq occur(nil,X) = 0 .
    eq occur((X;L),X) = s(occur(L,X)) .
    cq occur((Y;L),X) = occur(L,X)
       if neg(X = Y) .
    eq position((X;L),X) = 0 .
    cq position((X;L),Y) = s(position(L,X))
       if neg(X = Y) .
  }
}

BAG

#!python
module BAG
(
  X :: TRIV
)
{
  imports
  {
    pr(NIL)
    ex(PROP)
    pr(NUMBER)
  }
  signature
  {
    [ Nil Elt < Bag ]
    op _|_ : Bag Bag -> Bag { assoc comm id: nil }
    op _@_ : Elt Nil -> Prop
    op _@_ : Elt Elt -> Prop
    op _@_ : Elt Bag -> Prop
    op _sub_ : Bag Bag -> Bag
    op # : Nil -> Number
    op # : Elt -> Number
    op # : Bag -> Number
    op bag : Bag Elt -> Number
  }
  axioms {
    vars X Y : Elt
    vars S T : Bag
    eq (S | X = nil) = false .
    eq X @ nil = false .
    cq X @ (Y | S) = true
       if (X = Y) .
    cq X @ (Y | S) = X @ S
       if neg(X = Y) .
    eq nil sub S = nil .
    eq S sub nil = S .
    eq S sub (X | T) = (S sub X) sub T .
    eq (S | X) sub X = S .
    cq (S | Y) sub X = S sub X
       if (neg X = Y) .
    eq #(nil) = 0 .
    eq #(X | S) = s(#(S)) .
    eq bag(nil,X) = 0 .
    cq bag((Y | S),X) = bag(S,X)
       if (neg X = Y) .
    cq bag((Y | S),X) = s(bag(S,X))
       if (X = Y) .
  }
}

Updated