-
Notifications
You must be signed in to change notification settings - Fork 0
/
ooasp_racks_kb.lp
88 lines (67 loc) · 3.17 KB
/
ooasp_racks_kb.lp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
% Copyright (c) 2022 Siemens AG Oesterreich
% SPDX-License-Identifier: MIT
% EXAMPLE racks
% classes
ooasp_class(v1,object).
ooasp_class(v1,rack).
ooasp_subclass(v1,rack,object).
ooasp_class(v1,rackSingle).
ooasp_subclass(v1,rackSingle,rack).
ooasp_class(v1,rackDouble).
ooasp_subclass(v1,rackDouble,rack).
ooasp_class(v1,frame).
ooasp_subclass(v1,frame,object).
ooasp_class(v1,element).
ooasp_class(v1,elementA).
ooasp_class(v1,elementB).
ooasp_class(v1,elementC).
ooasp_class(v1,elementD).
ooasp_subclass(v1,element,object).
ooasp_subclass(v1,elementA,element).
ooasp_subclass(v1,elementB,element).
ooasp_subclass(v1,elementC,element).
ooasp_subclass(v1,elementD,element).
ooasp_class(v1,module).
ooasp_class(v1,moduleI).
ooasp_class(v1,moduleII).
ooasp_class(v1,moduleIII).
ooasp_class(v1,moduleIV).
ooasp_class(v1,moduleV).
ooasp_subclass(v1,module,object).
ooasp_subclass(v1,moduleI,module).
ooasp_subclass(v1,moduleII,module).
ooasp_subclass(v1,moduleIII,module).
ooasp_subclass(v1,moduleIV,module).
ooasp_subclass(v1,moduleV,module).
% associations
% -1 means * i.e. unrestricted
ooasp_assoc(v1,rack_frames,rack,1,1,frame,4,8).
ooasp_assoc(v1,frame_modules,frame,1,1,module,0,5).
ooasp_assoc(v1,element_modules,element,0,1,module,1,4).
ooasp_attribute(v1,frame,frame_position,int).
ooasp_attribute_minInclusive(v1,frame,frame_position,1).
ooasp_attribute_maxInclusive(v1,frame,frame_position,8).
% constraints -----------------------------------------------------
% type check and cardinalities
% TODO: find general solution
% assoc1_constraint(ASSOC,C1,CARD,C2)
% currently this means: In the ASSOC all elements of C1 are associated with exactly CARD of C2 and nothing else
assoc1_constraint(element_modules,elementA,1,moduleI).
assoc1_constraint(element_modules,elementB,2,moduleII).
assoc1_constraint(element_modules,elementC,3,moduleIII).
assoc1_constraint(element_modules,elementD,4,moduleIV).
ooasp_cv(C,assoc1_constraint1(ASSOC,ID1)):-ooasp_associated(C,ASSOC,ID1,ID2),assoc1_constraint(ASSOC,C1,CARD,C2),ooasp_isa(C,C1,ID1),not ooasp_isa(C,C2,ID2).
ooasp_cv(C,assoc1_constraint2(ASSOC,ID2)):-ooasp_associated(C,ASSOC,ID1,ID2),assoc1_constraint(ASSOC,C1,CARD,C2),not ooasp_isa(C,C1,ID1),ooasp_isa(C,C2,ID2).
ooasp_cv(C,card_constraint1(ASSOC,ID1)):-ooasp_is_associated1_cardinality(C,ASSOC,ID1,N),assoc1_constraint(ASSOC,C1,CARD,C2),ooasp_isa(C,C1,ID1),N!=CARD.
% rack_frames
ooasp_cv(C,rackSingle_requires_4frames(ID1)):-ooasp_is_associated1_cardinality(C,rack_frames,ID1,N), ooasp_isa(C,rackSingle,ID1), N!=4.
ooasp_cv(C,rackDouble_requires_8frames(ID1)):-ooasp_is_associated1_cardinality(C,rack_frames,ID1,N), ooasp_isa(C,rackDouble,ID1), N!=8.
% modules (except moduleV) require elements
ooasp_cv(C,module_requires_element(C,ID)):- ooasp_is_associated2_cardinality(C,element_modules,ID,0), not ooasp_isa(C,ID,moduleV).
ooasp_cv(C,module_may_not_have_element(C,ID)):-ooasp_is_associated2_cardinality(C,element_modules,ID,N), N>0, ooasp_isa(C,moduleV,ID).
ooasp_cv(C,frame_position_must_be_unique(C,F1,F2,P)):-
ooasp_associated(C,rack_frames,R,F1),
ooasp_associated(C,rack_frames,R,F2),
F1!=F2,
ooasp_attribute_value(C,frame_position,F1,P),
ooasp_attribute_value(C,frame_position,F2,P).