在整数模块中,我尝试定义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)) .
}
你可以告诉我哪里弄错了吗?我似乎无法自己解决这个问题。
答案 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。为什么会这样?”)