繁体   English   中英

使用 Double In 语句在合金中输入错误

[英]Type Error in Alloy using Double In Statement

我正在尝试编写一个使所有香蕉和新鲜苹果变得昂贵的谓词。 我能够达到其中一个条件,但不能同时达到。 我对使用 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

其它的办法:

所有香蕉由集合Banana所有新鲜苹果由集合Fresh & Apple表示 x 是昂贵的由x in Expensive

所以

Banana in Expensive
(Fresh & Apple) in Expensive

要不就

Banana + (Fresh & Apple) in Expensive

如果我正确理解您要执行的操作,则代码不会失败,因为您有 2 个“in”语句,这是因为您使用的是联合运算符(“+”)而不是逻辑 AND(“and”或“&&”)。

谓词的返回必须评估为 TRUE 或 FALSE。

如果你想说以下几点:

  • 苹果的所有实例都是昂贵和新鲜的,并且
  • Banana 的所有实例都很昂贵

...下面的代码将做到这一点:

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

但是,如果您想说:

  • 新鲜的苹果实例价格昂贵且
  • 香蕉的实例很昂贵

...以下代码是一种方法:

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 实例不新鲜。 换句话说,它将允许不新鲜的 Apple 实例变得昂贵。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM