Source : ISO 10303-54
SCHEMA set_theory_schema;
REFERENCE FROM
classification_schema -- ISO 10303-54
(class);
REFERENCE FROM
support_resource_schema -- ISO 10303-41
(identifier,
label,
text);
ENTITY complement;
id : identifier;
name : label;
description :
OPTIONAL
text;
set_1 : class;
set_2 : class;
universe : class;
WHERE
complement_different: NOT identical_sets(set_1, set_2);
END_ENTITY;
ENTITY intersection;
id : identifier;
name : label;
description :
OPTIONAL
text;
operand : SET[2:?] OF class;
resultant : class;
END_ENTITY;
ENTITY power_set;
id : identifier;
name : label;
description :
OPTIONAL
text;
base : class;
derived : class;
WHERE
derived_different: NOT identical_sets(base, derived);
END_ENTITY;
ENTITY proper_subset
SUBTYPE OF (subset);
WHERE
subset_different: NOT identical_sets(superset, subset);
END_ENTITY;
ENTITY same_membership;
id : identifier;
name : label;
description :
OPTIONAL
text;
set_1 : class;
set_2 : class;
END_ENTITY;
ENTITY subset;
id : identifier;
name : label;
description :
OPTIONAL
text;
subset : class;
superset : class;
END_ENTITY;
ENTITY union;
id : identifier;
name : label;
description :
OPTIONAL
text;
operand : SET[2:?] OF class;
resultant : class;
END_ENTITY;
ENTITY union_of_all_members;
id : identifier;
name : label;
description :
OPTIONAL
text;
operand : class;
resultant : class;
WHERE
resultant_different: NOT identical_sets(operand, resultant);
END_ENTITY;
FUNCTION identical_sets
(set_a : class; set_b : class) : BOOLEAN;
LOCAL set_of_sets : SET OF class := []; END_LOCAL; IF (set_a = set_b) THEN RETURN (TRUE); END_IF; set_of_sets := set_of_sets + set_b; RETURN (identical_to_one_of_set_of_sets(set_a, set_of_sets));
END_FUNCTION;
FUNCTION identical_to_one_of_set_of_sets
(set_a : class; set_of_sets : SET OF class) : BOOLEAN;
LOCAL i : INTEGER; initial_size : INTEGER; augmented_size : INTEGER; set_of_forward_equivalences : SET OF same_membership := []; set_of_backward_equivalences : SET OF same_membership := []; augmented_set_of_sets : SET OF class := []; END_LOCAL; -- test membership of the specified set of sets IF (set_a IN set_of_sets) THEN RETURN (TRUE); END_IF; -- extend the specified set to include all sets that have the same membership -- as an existing member initial_size := SIZEOF(set_of_sets); IF (initial_size = 0) THEN RETURN (FALSE); END_IF; REPEAT i := 1 TO initial_size; set_of_forward_equivalences := set_of_forward_equivalences + USEDIN(set_of_sets[i], 'SET_THEORY_SCHEMA.SAME_MEMBERSHIP.SET_1'); set_of_backward_equivalences := set_of_forward_equivalences + USEDIN(set_of_sets[i], 'SET_THEORY_SCHEMA.SAME_MEMBERSHIP.SET_2'); END_REPEAT; augmented_set_of_sets := set_of_sets; IF (SIZEOF(set_of_forward_equivalences) > 0) THEN REPEAT i := 1 to HIINDEX(set_of_forward_equivalences); augmented_set_of_sets := augmented_set_of_sets + set_of_forward_equivalences[i].set_2; END_REPEAT; END_IF; IF (SIZEOF(set_of_backward_equivalences) > 0) THEN REPEAT i := 1 to HIINDEX(set_of_backward_equivalences); augmented_set_of_sets := augmented_set_of_sets + set_of_backward_equivalences[i].set_1; END_REPEAT; END_IF; -- if the specified set of sets has been augmented, then test membership augmented_size := SIZEOF(augmented_set_of_sets); IF augmented_size = initial_size THEN RETURN (FALSE); END_IF; RETURN (identical_to_one_of_set_of_sets(set_a, augmented_set_of_sets));
END_FUNCTION;
END_SCHEMA; -- set_theory_schema