2014-05-24 6 views
0

합금으로 산술 연산을 수행하는 기능을 원합니다. 재미있게 정의하는 것이 좋습니다.합금의 산술 연산

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

당신이하려고하는 것이 확실하지 않지만 산술 표현식의 문법을 평가 함수와 함께 모델링하려는 것처럼 보입니다. 그렇다면 올바른 방법을 사용하고 있지만 표현식 유형을 단일 서명의 필드로 정의하는 대신 하위 서명으로 정의해야합니다.

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[[email protected], [email protected]] } 
sig Literal extends Expr { }