# Theory RPCParameters

Up to index of Isabelle/HOL/TLA/Memory

theory RPCParameters
imports MemoryParameters
uses [RPCParameters.ML]
begin

    (*
        File:        RPCParameters.thy
        ID:          $Id: RPCParameters.thy,v 1.5 2005/09/07 18:22:43 wenzelm Exp $
        Author:      Stephan Merz
        Copyright:   1997 University of Munich

        Theory Name: RPCParameters
        Logic Image: TLA

        RPC-Memory example: RPC parameters
        For simplicity, specify the instance of RPC that is used in the
        memory implementation.
    *)

    theory RPCParameters
    imports MemoryParameters
    begin

    datatype rpcOp = memcall memOp | othercall Vals
    datatype rpcState = rpcA | rpcB

    consts
      (* some particular return values *)
      RPCFailure     :: Vals
      BadCall        :: Vals

      (* Translate an rpc call to a memory call and test if the current argument
         is legal for the receiver (i.e., the memory). This can now be a little
         simpler than for the generic RPC component. RelayArg returns an arbitrary
         memory call for illegal arguments. *)
      IsLegalRcvArg  :: "rpcOp => bool"
      RPCRelayArg    :: "rpcOp => memOp"

    axioms
      (* RPCFailure is different from MemVals and exceptions *)
      RFNoMemVal:        "RPCFailure ~: MemVal"
      NotAResultNotRF:   "NotAResult ~= RPCFailure"
      OKNotRF:           "OK ~= RPCFailure"
      BANotRF:           "BadArg ~= RPCFailure"

    defs
      IsLegalRcvArg_def: "IsLegalRcvArg ra ==
                             case ra of (memcall m) => True
                                      | (othercall v) => False"
      RPCRelayArg_def:   "RPCRelayArg ra ==
                             case ra of (memcall m) => m
                                      | (othercall v) => arbitrary"

    ML {* use_legacy_bindings (the_context ()) *}

    end