Ошибка типа в Alloy с использованием оператора Double In - PullRequest
1 голос
/ 05 марта 2020

Я пытаюсь написать предикат, который сделает все бананы и яблоки Fre sh дорогими. Я в состоянии выполнить одно из условий, но никогда оба. Я очень плохо знаком с использованием Alloy, любая помощь будет принята с благодарностью.

Ниже приведен мой код, ошибка возникает из-за того, что я использую двойной оператор In, но я не уверен, как можно написать это без необходимости использовать два оператора In. Я получаю сообщение об ошибке «Ошибка типа, это должен быть набор или отношение»

sig Fruit{}
sig Banana, Apple, Pear extends Fruit {}
sig Fresh, Expensive in Fruit{}

pred BananasAndFreshApplesAreExpensive {
Apple in (Expensive & Fresh) + Banana in Expensive
} 
run BananasAndFreshApplesAreExpensive

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Другой способ:

все бананы представлены набором Banana все фри sh яблоки представлены набором Fresh & Apple x дорого представлен x in Expensive

Итак

Banana in Expensive
(Fresh & Apple) in Expensive

или просто

Banana + (Fresh & Apple) in Expensive
0 голосов
/ 06 марта 2020

Если я правильно понимаю, что вы пытаетесь сделать, код не дает сбоя, потому что у вас есть 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, быть дорогими.

...