Если я правильно понимаю, что вы пытаетесь сделать, код не дает сбоя, потому что у вас есть 2 "in" оператора, это потому, что вы используете оператор объединения ("+") вместо логического И (" и "или" && ").
Возвращение предиката должно принимать значение ИСТИНА или ЛОЖЬ.
Если вы пытаетесь сказать следующее:
- Все экземпляры Apple дорогие и бесплатные sh И
- Все экземпляры банана дорогие
... следующий код сделает это:
sig Fruit{}
sig Banana, Apple, Pear extends Fruit {}
sig Fresh, Expensive in Fruit{}
pred BananasAndFreshApplesAreExpensive {
Apple in (Expensive & Fresh) and Banana in Expensive
}
run BananasAndFreshApplesAreExpensive
Однако, если вы пытаетесь сказать:
- Экземпляры Apple, которые свободны sh дорого И
- Экземпляры Банана стоят дорого
... Один из способов сделать это - следующий код:
sig Fruit{}
sig Banana, Apple, Pear extends Fruit {}
sig Fresh, Expensive in Fruit{}
pred BananasAndFreshApplesAreExpensive {
(all a: Apple | a in Fresh => a in Expensive) and
Banana in Expensive
}
run BananasAndFreshApplesAreExpensive
Хранить в Имейте в виду, однако, что это ничего не говорит о случаях Apple, которые не являются sh. Другими словами, это позволит экземплярам Apple, которые не являются бесплатными sh, быть дорогими.