Alloy 合金中的算术运算

Alloy 合金中的算术运算,alloy,Alloy,我想在alloy中有一个算术运算的函数,用下面有趣的方式定义它们是一个好主意吗 sig expre{ add: expre -> expre, sub: expre -> expre, mult: expre -> expre, div: expre -> expre, mod: expre -> expre, a: AttributeNames, val: Int } fun Exp(e: expre):

我想在alloy中有一个算术运算的函数,用下面有趣的方式定义它们是一个好主意吗

sig expre{
    add: expre -> expre,
    sub: expre -> expre,
    mult: expre -> expre,
    div: expre -> expre,
    mod: expre -> expre,
    a: AttributeNames,
    val: Int
}

fun Exp(e: expre): Int{
     plus[e.val, e.val] + 
     minus[e.val, e.val] +
     mul[e.val, e.val] +
     div[e.val, e.val] +
     rem[e.val, e.val] +
     Exp[e]
}

不确定您想做什么,但看起来您可能正在寻找算术表达式的语法模型以及求值函数。如果是这样,您的思路是正确的,但是您可能不想将表达式类型定义为单个签名的字段,而是想将它们定义为子签名:

abstract sig Expr { val: Int }
abstract sig UnaryExpr extends Expr { target: Expr }
abstract sig BinaryExpr extends Expr { left, right: Expr }
sig PlusExpr extends BinaryExpr { } {val = plus[left.@val, right.@val] }  
sig Literal extends Expr { }