ocl constraint with recursive class
For a little bit of context: a Class can have other Class as Requirement to be taken by a student. The Class is taken by a Student via a ClassGroup which can be ordered in time with its attribute sessionYear.

I want to put an OCL invariable constraint that will check if, for the sessionYear a ClassGroup, its Class Requierement were already taken before this sessionYear.
in other words: sessionYear for Requirement < sessionYear for Class
I tried a quite a few constaints and my closest attempt was this one:
context Etudiant inv C6: if ClassTaken->notEmpty then
classTaken->forAll(ct|ct.class.Requirement.OfferedGroup->collect(sessionYear)->forAll(sy| sy < cs.sessionYear))
else true endif
But the problem is, in the forAll(sy| sy->sy < cs.sessionYear), sy won't be the Student required ClassTaken for a ClassGroup, but rather a Bag with every instances of OfferedGroup that are Requirement for it.
recursion constraints ocl
add a comment |
For a little bit of context: a Class can have other Class as Requirement to be taken by a student. The Class is taken by a Student via a ClassGroup which can be ordered in time with its attribute sessionYear.

I want to put an OCL invariable constraint that will check if, for the sessionYear a ClassGroup, its Class Requierement were already taken before this sessionYear.
in other words: sessionYear for Requirement < sessionYear for Class
I tried a quite a few constaints and my closest attempt was this one:
context Etudiant inv C6: if ClassTaken->notEmpty then
classTaken->forAll(ct|ct.class.Requirement.OfferedGroup->collect(sessionYear)->forAll(sy| sy < cs.sessionYear))
else true endif
But the problem is, in the forAll(sy| sy->sy < cs.sessionYear), sy won't be the Student required ClassTaken for a ClassGroup, but rather a Bag with every instances of OfferedGroup that are Requirement for it.
recursion constraints ocl
add a comment |
For a little bit of context: a Class can have other Class as Requirement to be taken by a student. The Class is taken by a Student via a ClassGroup which can be ordered in time with its attribute sessionYear.

I want to put an OCL invariable constraint that will check if, for the sessionYear a ClassGroup, its Class Requierement were already taken before this sessionYear.
in other words: sessionYear for Requirement < sessionYear for Class
I tried a quite a few constaints and my closest attempt was this one:
context Etudiant inv C6: if ClassTaken->notEmpty then
classTaken->forAll(ct|ct.class.Requirement.OfferedGroup->collect(sessionYear)->forAll(sy| sy < cs.sessionYear))
else true endif
But the problem is, in the forAll(sy| sy->sy < cs.sessionYear), sy won't be the Student required ClassTaken for a ClassGroup, but rather a Bag with every instances of OfferedGroup that are Requirement for it.
recursion constraints ocl
For a little bit of context: a Class can have other Class as Requirement to be taken by a student. The Class is taken by a Student via a ClassGroup which can be ordered in time with its attribute sessionYear.

I want to put an OCL invariable constraint that will check if, for the sessionYear a ClassGroup, its Class Requierement were already taken before this sessionYear.
in other words: sessionYear for Requirement < sessionYear for Class
I tried a quite a few constaints and my closest attempt was this one:
context Etudiant inv C6: if ClassTaken->notEmpty then
classTaken->forAll(ct|ct.class.Requirement.OfferedGroup->collect(sessionYear)->forAll(sy| sy < cs.sessionYear))
else true endif
But the problem is, in the forAll(sy| sy->sy < cs.sessionYear), sy won't be the Student required ClassTaken for a ClassGroup, but rather a Bag with every instances of OfferedGroup that are Requirement for it.
recursion constraints ocl
recursion constraints ocl
edited Nov 12 at 11:07
asked Nov 12 at 11:01
Takyon
105
105
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
Trying quite a few constraints is hacking and does not always lead to a satisfactory result in a reasonable period of time.
OCL is a moderately readable formal language.
Once you express the intent of your constraint clearly in English (or French or ...) you should find that it can be transliterated relatively easily into OCL.
Think/design do not hack.
add a comment |
I ended up doing this something like this:
context Student
inv C6: inscription->forAll(insc|ClassTaken.class.Requirement->forAll(prer|inscription->exists(preIns|preIns.ClassTaken.class = prer
and if preIns.ClassTaken = insc.ClassTaken then true
else preIns.ClassTaken.sessionYear < insc.ClassTaken.sessionYear endif)))
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53260751%2focl-constraint-with-recursive-class%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
Trying quite a few constraints is hacking and does not always lead to a satisfactory result in a reasonable period of time.
OCL is a moderately readable formal language.
Once you express the intent of your constraint clearly in English (or French or ...) you should find that it can be transliterated relatively easily into OCL.
Think/design do not hack.
add a comment |
Trying quite a few constraints is hacking and does not always lead to a satisfactory result in a reasonable period of time.
OCL is a moderately readable formal language.
Once you express the intent of your constraint clearly in English (or French or ...) you should find that it can be transliterated relatively easily into OCL.
Think/design do not hack.
add a comment |
Trying quite a few constraints is hacking and does not always lead to a satisfactory result in a reasonable period of time.
OCL is a moderately readable formal language.
Once you express the intent of your constraint clearly in English (or French or ...) you should find that it can be transliterated relatively easily into OCL.
Think/design do not hack.
Trying quite a few constraints is hacking and does not always lead to a satisfactory result in a reasonable period of time.
OCL is a moderately readable formal language.
Once you express the intent of your constraint clearly in English (or French or ...) you should find that it can be transliterated relatively easily into OCL.
Think/design do not hack.
answered Nov 12 at 11:47
Ed Willink
45017
45017
add a comment |
add a comment |
I ended up doing this something like this:
context Student
inv C6: inscription->forAll(insc|ClassTaken.class.Requirement->forAll(prer|inscription->exists(preIns|preIns.ClassTaken.class = prer
and if preIns.ClassTaken = insc.ClassTaken then true
else preIns.ClassTaken.sessionYear < insc.ClassTaken.sessionYear endif)))
add a comment |
I ended up doing this something like this:
context Student
inv C6: inscription->forAll(insc|ClassTaken.class.Requirement->forAll(prer|inscription->exists(preIns|preIns.ClassTaken.class = prer
and if preIns.ClassTaken = insc.ClassTaken then true
else preIns.ClassTaken.sessionYear < insc.ClassTaken.sessionYear endif)))
add a comment |
I ended up doing this something like this:
context Student
inv C6: inscription->forAll(insc|ClassTaken.class.Requirement->forAll(prer|inscription->exists(preIns|preIns.ClassTaken.class = prer
and if preIns.ClassTaken = insc.ClassTaken then true
else preIns.ClassTaken.sessionYear < insc.ClassTaken.sessionYear endif)))
I ended up doing this something like this:
context Student
inv C6: inscription->forAll(insc|ClassTaken.class.Requirement->forAll(prer|inscription->exists(preIns|preIns.ClassTaken.class = prer
and if preIns.ClassTaken = insc.ClassTaken then true
else preIns.ClassTaken.sessionYear < insc.ClassTaken.sessionYear endif)))
answered Nov 20 at 3:06
Takyon
105
105
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53260751%2focl-constraint-with-recursive-class%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown