2008-04-02 13:46:28 +00:00
|
|
|
(*****************************************************************************
|
|
|
|
* su4sml --- a SML repository for managing (Secure)UML/OCL models
|
|
|
|
* http://projects.brucker.ch/su4sml/
|
|
|
|
*
|
|
|
|
* context_declarations.sml ---
|
|
|
|
* This file is part of su4sml.
|
|
|
|
*
|
|
|
|
* Copyright (c) 2005-2007, ETH Zurich, Switzerland
|
|
|
|
*
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions are
|
|
|
|
* met:
|
|
|
|
*
|
|
|
|
* * Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
*
|
|
|
|
* * Redistributions in binary form must reproduce the above
|
|
|
|
* copyright notice, this list of conditions and the following
|
|
|
|
* disclaimer in the documentation and/or other materials provided
|
|
|
|
* with the distribution.
|
|
|
|
*
|
|
|
|
* * Neither the name of the copyright holders nor the names of its
|
|
|
|
* contributors may be used to endorse or promote products derived
|
|
|
|
* from this software without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
|
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
******************************************************************************)
|
|
|
|
(* $Id: context_declarations.sml 6727 2007-07-30 08:43:40Z brucker $ *)
|
|
|
|
|
|
|
|
(** Implementation of the Liskov Substitiution Principle. *)
|
|
|
|
signature WFCPOG_DATA_MODEL_CONSISTENCY_CONSTRAINT =
|
|
|
|
sig
|
|
|
|
(** sub constraint, included in liskov.*)
|
2008-04-28 08:17:52 +00:00
|
|
|
val class_model_consistency : WFCPOG.wfpo -> Rep.Model -> (Rep_OclType.Path * Rep_OclTerm.OclTerm) list
|
2008-04-02 13:46:28 +00:00
|
|
|
(** sub constraint, included in liskov.*)
|
2008-04-28 08:17:52 +00:00
|
|
|
val strong_model_consistency : WFCPOG.wfpo -> Rep.Model -> (Rep_OclType.Path * Rep_OclTerm.OclTerm) list
|
2008-04-02 13:46:28 +00:00
|
|
|
end
|
|
|
|
structure WFCPOG_Data_Model_Consistency_Constraint : WFCPOG_DATA_MODEL_CONSISTENCY_CONSTRAINT =
|
|
|
|
struct
|
|
|
|
|
|
|
|
(* su4sml *)
|
|
|
|
open Rep_Logger
|
|
|
|
open Rep_Core
|
|
|
|
open Rep_OclTerm
|
|
|
|
open Rep_OclType
|
|
|
|
open ModelImport
|
|
|
|
open Rep2String
|
2008-04-23 20:37:14 +00:00
|
|
|
open HolOcl_Namespace
|
2008-04-02 13:46:28 +00:00
|
|
|
(* ocl-parser *)
|
|
|
|
open ModelImport
|
|
|
|
open Context
|
|
|
|
|
|
|
|
(* wfcpo-gen *)
|
|
|
|
open WFCPOG_Library
|
|
|
|
|
|
|
|
|
|
|
|
exception WFCPO_DataModelError
|
|
|
|
|
|
|
|
|
|
|
|
fun c_allInstance_term (c:Classifier) =
|
2008-04-23 20:32:08 +00:00
|
|
|
let
|
|
|
|
val _ = trace function_calls ("WF_data_CS.c_allInstances\n")
|
2008-04-29 18:48:45 +00:00
|
|
|
val uni_name_x = HolOcl_Namespace.gen_unique_string()
|
|
|
|
val x = Variable (uni_name_x,DummyT)
|
2008-04-23 20:32:08 +00:00
|
|
|
(* get class as an holocl term *)
|
2008-04-25 13:03:55 +00:00
|
|
|
val holocl_class_name = get_class_of (name_of c)
|
2008-04-23 20:32:08 +00:00
|
|
|
val class_type = type_of c
|
2008-04-29 18:48:45 +00:00
|
|
|
val uni_name_c = HolOcl_Namespace.gen_unique_string()
|
|
|
|
val class = Variable(uni_name_c,class_type)
|
2008-04-23 20:32:08 +00:00
|
|
|
(* OclAny.allInstances() *)
|
2008-04-26 12:06:20 +00:00
|
|
|
val allInstances = OperationCall (class,class_type,["oclLib","OclAny","allInstances"],[],Set (class_type))
|
2008-04-28 13:30:51 +00:00
|
|
|
(* x.oclIsTypeOf(c) *)
|
|
|
|
val oclIsTypeOf = OperationWithType (x,DummyT,"oclIsTypeOf",class_type,Boolean)
|
2008-04-23 20:32:08 +00:00
|
|
|
(* Iterator exists *)
|
2008-04-29 18:48:45 +00:00
|
|
|
val exists = Iterator("exists",[(uni_name_x,DummyT)],allInstances,Set(class_type),oclIsTypeOf,Boolean,Boolean)
|
2008-04-23 21:35:17 +00:00
|
|
|
val _ = trace function_ends ("WF_data_CS.c_allInstances\n")
|
2008-04-02 13:46:28 +00:00
|
|
|
in
|
2008-04-23 20:32:08 +00:00
|
|
|
exists
|
2008-04-02 13:46:28 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
(* E t. t |= c::allInstances()->exists(x|x.oclIsTypeOf(c)) *)
|
|
|
|
fun single_model_consistency (c:Classifier) (model as (clist,alist)) =
|
|
|
|
let
|
2008-04-23 16:12:00 +00:00
|
|
|
val _ = trace function_calls("WFCPOG_Data_Model_Consistency_Constraint.single_model_consistency\n")
|
2008-04-02 13:46:28 +00:00
|
|
|
val term = c_allInstance_term c
|
2008-04-29 22:14:26 +00:00
|
|
|
val local_valid = OperationCall(term,Boolean,["holOclLib","Boolean","OclLocalValid"],[(Literal("\\<tau>",OclState),DummyT)],Boolean)
|
2008-04-29 11:39:18 +00:00
|
|
|
val dummy_source = Literal("",DummyT)
|
2008-04-29 22:14:26 +00:00
|
|
|
val res = Iterator("holOclLib.exists",[("\\<tau>",OclState)],dummy_source,DummyT,local_valid,Boolean,Boolean)
|
2008-04-23 16:12:00 +00:00
|
|
|
val _ = trace function_ends("WFCPOG_Data_Model_Consistency_Constraint.single_model_consistency\n")
|
2008-04-02 13:46:28 +00:00
|
|
|
in
|
2008-04-23 16:12:00 +00:00
|
|
|
res
|
2008-04-02 13:46:28 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
fun class_model_consistency_help [] (model as (clist,alist)) = []
|
|
|
|
| class_model_consistency_help (h::classes) (model as (clist,alist)) =
|
2008-04-28 08:17:52 +00:00
|
|
|
(["po_class_model_"]@(name_of h),single_model_consistency h model)::(class_model_consistency_help classes model)
|
2008-04-02 13:46:28 +00:00
|
|
|
|
|
|
|
fun class_model_consistency wfpo (model as (clist,alist)) =
|
|
|
|
let
|
|
|
|
val classifiers = removeOclLibrary (clist)
|
|
|
|
in
|
|
|
|
class_model_consistency_help classifiers model
|
|
|
|
end
|
|
|
|
|
|
|
|
fun strong_model_consistency_help classes model =
|
|
|
|
let
|
2008-04-23 16:12:00 +00:00
|
|
|
val _ = trace function_calls("WFCPOG_Data_Model_Consistency_Constraint.strong_model_consistency\n")
|
2008-04-02 13:46:28 +00:00
|
|
|
val terms = List.map (c_allInstance_term) classes
|
2008-04-29 22:14:26 +00:00
|
|
|
val local_valids = List.map (fn a => OperationCall(a,Boolean,["holOclLib","Boolean","OclLocalValid"],[(Literal("\\<tau>",OclState),DummyT)],Boolean)) terms
|
2008-04-29 16:17:43 +00:00
|
|
|
val con_term = conjugate_terms local_valids
|
|
|
|
val dummy_source = Literal("",DummyT)
|
2008-04-29 22:14:26 +00:00
|
|
|
val res = Iterator("holOclLib.exists",[("\\<tau>",OclState)],dummy_source,DummyT,con_term,Boolean,Boolean)
|
2008-04-23 16:12:00 +00:00
|
|
|
val _ = trace function_ends("WFCPOG_Data_Model_Consistency_Constraint.strong_model_consistency\n")
|
2008-04-02 13:46:28 +00:00
|
|
|
in
|
2008-04-29 16:17:43 +00:00
|
|
|
[(["po_strong_model"],res)]
|
2008-04-02 13:46:28 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
fun strong_model_consistency wfpo (model as (clist,alist)) =
|
|
|
|
let
|
|
|
|
val classifiers = removeOclLibrary (clist)
|
|
|
|
in
|
|
|
|
strong_model_consistency_help classifiers model
|
|
|
|
end
|
|
|
|
end;
|