Есть ли более простой способ указать это?

Как и в следующем коде, есть ли способ создать макросы для выражений NP + NF2 + NF1 + NT + NR и AnonActive + 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}

person wxlfrank    schedule 21.08.2014    source источник


Ответы (1)


Одним из простых способов было бы объявить абстрактные подписи Node и Arrow и объявить каждую из ваших существующих подписей как расширение той или иной из них.

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

Поскольку все ваши стрелки имеют одинаковые отношения, отношения могут быть объявлены в знаке стрелки; ограничения на типы узлов, разрешенных в качестве исходных и целевых, могут быть заданы с использованием фактов подписи, например:

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
}

Н.Б. Я не проверял их на синтаксические ошибки...

person C. M. Sperberg-McQueen    schedule 21.08.2014