我想在合金中使用算术运算函数,如果将它们定义为下面的乐趣是一个好主意吗?
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]
}
答案 0 :(得分:0)
不确定您要做什么,但看起来您可能正在寻找模拟算术表达式的语法以及评估函数。如果是这样,你就是在正确的轨道上,而不是将表达式类型定义为单个签名的字段,你可能想要将它们定义为子签名:
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 { }