【问题标题】:Is there an easier way to specify this?有没有更简单的方法来指定这个?
【发布时间】:2014-08-21 14:41:51
【问题描述】:

如以下代码,有没有办法为表达式NP + NF2 + NF1 + NT + NRAnonActive + Aactive + AsetTurn + Astart + Acrit + Acheck + APF2 + APF1 + ATP + ATR + AF2R + AF1R制作宏,以便我以后可以通过名称引用它们而不是直接写出表达式?

sig NP{}
sig NF2{}
sig NF1{}
sig NT{}
sig NR{}

sig AnonActive{src:one NP, trg:one NP}
sig Aactive{src:one NP, trg:one NP}
sig AsetTurn{src:one NP, trg:one NP}
sig Astart{src:one NP, trg:one NP}
sig Acrit{src:one NP, trg:one NP}
sig Acheck{src:one NP, trg:one NP}
sig APF2{src:one NP, trg:one NF2}
sig APF1{src:one NP, trg:one NF1}
sig ATP{src:one NT, trg:one NP}
sig ATR{src:one NT, trg:one NR}
sig AF2R{src:one NF2, trg:one NR}
sig AF1R{src:one NF1, trg:one NR}

sig Graph{nodes:set NP+NF2+NF1+NT+NR, 
          arrows:set AnonActive + Aactive + AsetTurn + Astart 
                     + Acrit + Acheck + APF2 + APF1 + ATP + ATR 
                     + AF2R + AF1R}

【问题讨论】:

    标签: alloy


    【解决方案1】:

    一种简单的方法是声明抽象签名NodeArrow,并将您现有的每个签名声明为扩展其中一个或另一个。

    abstract sig Node {}
    sig NP extends Node {}
    sig NF2 extends Node {}
    ... 
    

    由于所有箭头都具有相同的关系,因此可以在 Arrow sig 中声明这些关系;可以使用签名事实给出对允许作为源和目标的节点种类的限制,例如:

    abstract sig Arrow {
      src:  one Node,
      trg:  one Node
    }
    sig AnonActive extends Arrow {}{
      one + trg in NP
    }
    ...
    sig AF1R extends Arrow {}{
      src in NF1
      trg in NR
    }
    

    现在 Graph 的声明非常简单(而且,至少在某些人看来,可能更清楚一点):

    sig Graph {
      nodes: set Node,
      arrows: set Arrow 
    }
    

    另一种方法(我认为在所示情况下不太好,但在无法应用第一种方法的情况下很有用)是定义具有适当名称的函数:

    fun Node : set univ {
      NP + NF2 + NF1 + NT + NR
    }
    fun Arrow : set univ {
      AnonActive + Aactive + AsetTurn + Astart 
      + Acrit + Acheck + APF2 + APF1 + ATP + ATR 
      + AF2R + AF1R
    }
    

    注意我没有检查这些语法错误...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      相关资源
      最近更新 更多