CafeOBJ cmmdc和理性数字

时间:2009-04-03 22:08:28

标签: functional-programming

在整数模块中,我尝试定义cmmdc操作以找到最大的公共倍数。问题是我做错了,因为代码不适用于5和3等2个素数。

这是整数模块的代码:

module integer

{

    protecting (natural)

    [nat < int]



    op s_ : int -> int                  
    op _+_ : int int -> int { assoc comm idr: 0 }
    op _-_ : int int -> int             
    op _*_ : int int -> int { assoc comm idr: (s 0) } 
    op _/_ : int int -> int     
    op _<_ : int int -> int     
    op _>_ : int int -> int     
    op _<=_ : int int -> int    
    op cmmdc : int int -> int   




    op p_ : int -> int                  -- Predecesor (pentru numere negative)

    op -_ : int -> int                  -- Minusul 



-- -----------------------------------Variable-------------------------------------------------



    vars x y z a b : int



-- -----------------------------------Ecuatii---------------------------------------------------


-- definirea modului de functionare al lui p fata de s


    eq s p x = x .

    eq p s x = x .


-- definirea lui - ca semn


    eq - - x = x .

    eq - 0 = 0 .

    eq - p x = s - x .

    eq - s x = p - x .

-- Adunarea


    eq x + p y = p(x + y) .


-- Scaderea


    eq x - y = x + (- y) .

-- Inmultirea

    eq x * p y = x * y - x .

-- cmmdc

    eq cmmdc(0, x) = x .
    eq cmmdc(x, 0) = x .
    eq cmmdc(s 0, s 0) = s 0 .
    ceq cmmdc(x, y) = cmmdc(x - y , y) if (x > y) .
    ceq cmmdc(x, y) = cmmdc(y - x , x) if (y > x) .



}

由于我输入的是自然数,所以这是自然模块:

module natural

{

    [nat]

    [nznat]

    [nznat < nat]



    op 0 : -> nat

    op s_ : nat -> nznat

    op toBool_ : nat -> Bool



    op _+_ : nat nat -> nat { assoc comm idr: 0 prec: 33}
    op _-'_ : nat nat -> nat
    op _*_ : nat nat -> nat { assoc comm idr: (s 0) prec: 31}
    op _/'_ : nat nznat -> nat
    op _<_ : nat nat -> Bool
    op _>_ : nat nat -> Bool
    op _<=_ : nat nat -> Bool

    op mod : nat nznat -> nat



-- ---------------------------Variabile-------------------------

    var x : nat

    var y : nat

    var z : nat

    var a : nznat


-- ---------------------------Ecuatii---------------------------    

    -- eq x + 0 = x .

    -- eq 0 + x = x .


-- Suma:


    eq x + s y = s (x + y) .


-- Diferenta:   


    eq x -' 0 = x .

    eq 0 -' x = 0 .

    eq s x -' s y = x -' y .


-- Inmultirea

    eq x * 0 = 0 .
    eq x * s y = x * y + x .

-- Impartirea:      [parte intreaga]


    eq 0 /' a = 0 .

    eq x /' a = ((x -' a) /' a) + s 0 .


-- ?


    -- eq 0 < z = true .

    -- eq x < y = toBool (x -' y) .

    -- ceq x < y = true if toBool (x -' y) .

    -- ceq x < y = false if toBool (x -' y) == false .


-- Conversie de la integer la Bool

    eq toBool 0 = true .

    eq toBool z = false .

-- Mai mic


    eq x < y = toBool (x -' y) .


-- Mai mic sau egal 

    ceq x <= y = true if ( x < y ) or ( x == y) .

    ceq x <= y = false if ( y < x ) .


-- Mai mare


    ceq x > y = true if ( y < x ) .

    ceq x > y = false if ( x < y ) .

-- mod

    ceq mod(x, a) = x if (x < a) .
    ceq mod(x, a) = mod(x -' a, a) if (x > a) .




}

另外,我被要求为有理数(Q)制作一个模块。 这是我到目前为止所写的内容,但似乎有些不对劲:

module rational
{
    protecting (integer)
    [integer < rational]    
    [rational* < rational]

    op _|_ : int nznat -> rational
    op _||_ : nznat nznat -> rational*

    op _+"_ : rational rational -> rational
    op _-"_ : rational rational -> rational
    op _*"_ : rational rational -> rational
    op _/"_ : rational rational* -> rational

    op reducere_ : rational -> rational

-- -----------------------------------Variabile-------------------------------------------------    
    var x : int
    var y : int
    var z : int

    var a : nznat
    var b : nznat
    var c : nznat

-- -----------------------------------Ecuatii---------------------------------------------------

-- Adunarea

    ceq (x | a) +" (y | b) = ( x + y ) | a if ( a == b) .
    ceq (x | a) +" (y | b) = ( x * b + y * a ) | ( a * b) if (a > b) or (a < b) .

-- Scaderea

    ceq (x | a) -" (y | b) = ( x - y ) | a if ( a == b) .
    ceq (x | a) -" (y | b) = ( x * b - y * a ) | ( a * b) if (a > b) or (a < b) .

-- Inmultirea

    eq (x | a) *" (y | b) = (x * y) | (a * b) .

-- Impartirea

    eq (x | a) /" (b || c) = (x * c) | (a * b) .

-- Aducere la acelasi numitor 

    eq reducere x | a = (x / cmmdc(x, a)) | (a / cmmdc(x, a)) .


}
你可以告诉我哪里弄错了吗?我似乎无法自己解决这个问题。

2 个答案:

答案 0 :(得分:1)

尝试“设置步骤” 然后“减少cmmdc(5,3)。” 并在每一步按“n”继续。检查每一步,看看它是否符合您的期望

翻译: incearca cu“set step on” apoi“减少cmmdc(5,3)。” si la fiecare pas apasa“n”(n de la next)si verifica atent daca se intampla ceea ce te astepti。

祝你好运

答案 1 :(得分:0)

(我假设我们谈到“最大公约数”,因为“最大公约数”只是毫无意义。)

我不知道这是什么语言,但似乎你没有cmmdc的参数相等的情况的条款。

顺便说一下,cmmdc(5,3)的结果是什么?你期待什么?

(请注意,而不是问“为什么cmmdc(5,3)错了?”,最好问一下:“cmmdc(5,3)返回x,但我预期为y。为什么会这样?”)