Functional programming CafeOBJ-cmmdc与有理数

Functional programming CafeOBJ-cmmdc与有理数,functional-programming,Functional Programming,在整数模块中,我试图定义cmmdc操作,以找到最大的公共倍数。问题是我做错了什么,因为代码不适用于2个素数,比如5和3 这是我的整数模块代码: module integer { protecting (natural) [nat < int] op s_ : int -> int op _+_ : int int -> int { assoc comm idr: 0 } op _-_ : i

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

这是我的整数模块代码:

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) .



}
模块整数
{
保护(自然)
[natint
op{uuu+\:int->int{assoc comm idr:0}
运算-:int->int
op{u*\:int->int{assoc comm idr:(s0)}
op u/u:int->int
运算量
操作:int->int
运算量
op cmmdc:int->int
op p_u2;:int->int--先驱者(pentru数值负值)
op-uU2;:int->int--Minusul
--------------------------------------变量-------------------------------------------------
变量x y z a b:int
--------------------------------------埃库蒂---------------------------------------------------
--功能模块的定义
等式s p x=x。
等式p s x=x。
--路易·卡·塞曼
等式--x=x。
等式-0=0。
等式px=s-x。
等式-sx=p-x。
--阿杜纳里亚
等式x+py=p(x+y)。
--骗子
等式x-y=x+(-y)。
--多区域
等式x*py=x*y-x。
--cmmdc
等式cmmdc(0,x)=x。
等式cmmdc(x,0)=x。
等式cmmdc(s0,s0)=s0。
ceq cmmdc(x,y)=cmmdc(x-y,y)如果(x>y)。
如果(y>x),ceq cmmdc(x,y)=cmmdc(y-x,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) .




}
模块自然
{
[nat]
[nznat]
[nznatnat
操作:nat->nznat
op toBool_u2;:nat->Bool
op{uuu+\:nat-nat->nat{assoc comm idr:0 prec:33}
操作:nat nat->nat
op*.:nat nat->nat{assoc comm idr:(s0)prec:31}
操作:nat nznat->nat
奥普布尔
操作:nat nat->Bool
奥普布尔
操作模式:nat nznat->nat
--------------------------------可变-------------------------
变量x:nat
变量y:nat
var z:nat
变量a:nznat
--------------------------------------Ecuatii-----------------
--等式x+0=x。
--等式0+x=x。
--苏马:
等式x+sy=s(x+y)。
--不同的:
等式x-'0=x。
等式0-‘x=0。
等式s x-'s y=x-'y。
--多区域
等式x*0=0。
等式x*sy=x*y+x。
--因蒂里亚:[因特拉加广场]
等式0/‘a=0。
等式x/'a=((x-'a)/'a)+s0。
-- ?
--等式0a)。
}

另外,我还被要求制作一个有理数(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)) .


}
模块rational
{
保护(整数)
[整数<有理]
[rational*rational
op | | |:nznat-nznat->rational*
op u+“\:rational->rational
op-“u:rational->rational
op*“\:理性->理性
op/“\:rational*->rational
操作还原:理性->理性
--------------------------------------变量------------------------------------------
变量x:int
变量y:int
变量z:int
变量a:nznat
变量b:nznat
变量c:nznat
--------------------------------------埃库蒂---------------------------------------------------
--阿杜纳里亚
ceq(x | a)+(y | b)=(x+y)| a如果(a==b)。
如果(a>b)或(ab)或(a
你能告诉我哪里出错了吗?我似乎无法独自解决这个问题。

(我想我们把“最大公约数”称为“最大公倍数”毫无意义。)

我不知道这是什么语言,但似乎您没有一个子句来说明cmmdc的参数相等的情况

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

(请注意,与其问“为什么cmmdc(5,3)错了?”不如问:“cmmdc(5,3)返回x,但我预期是y。这是为什么?”)

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

翻译: 因卡卡cu“设置踏面” apoi“减少cmmdc(5,3)” 请确认您是否已收到您的电子邮件

祝你好运