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)”
请确认您是否已收到您的电子邮件
祝你好运