Skip to content
Snippets Groups Projects
Commit c0785649 authored by Regis Blanc's avatar Regis Blanc
Browse files

rational invariant positive denominator

parent 49711e10
No related branches found
No related tags found
No related merge requests found
......@@ -12,32 +12,34 @@ case class Rational(numerator: BigInt, denominator: BigInt) {
def +(that: Rational): Rational = {
require(this.isRational && that.isRational)
Rational(this.numerator*that.denominator + that.numerator*this.denominator, this.denominator*that.denominator)
}
} ensuring(res => res.isRational)
def -(that: Rational): Rational = {
require(this.isRational && that.isRational)
Rational(this.numerator*that.denominator - that.numerator*this.denominator, this.denominator*that.denominator)
}
} ensuring(res => res.isRational)
def unary_- : Rational = {
require(this.isRational)
Rational(-this.numerator, this.denominator)
}
} ensuring(res => res.isRational)
def *(that: Rational): Rational = {
require(this.isRational && that.isRational)
Rational(this.numerator*that.numerator, this.denominator*that.denominator)
}
} ensuring(res => res.isRational)
def /(that: Rational): Rational = {
require(this.isRational && that.isRational && that.nonZero)
Rational(this.numerator*that.denominator, this.denominator*that.numerator)
}
val newNumerator = this.numerator*that.denominator
val newDenominator = this.denominator*that.numerator
normalize(newNumerator, newDenominator)
} ensuring(res => res.isRational)
def reciprocal: Rational = {
require(this.isRational && this.nonZero)
Rational(this.denominator, this.numerator)
}
normalize(this.denominator, this.numerator)
} ensuring(res => res.isRational)
def ~(that: Rational): Boolean = {
......@@ -47,50 +49,22 @@ case class Rational(numerator: BigInt, denominator: BigInt) {
def <(that: Rational): Boolean = {
require(this.isRational && that.isRational)
if(this.denominator >= 0 && that.denominator >= 0)
this.numerator*that.denominator < that.numerator*this.denominator
else if(this.denominator >= 0 && that.denominator < 0)
this.numerator*that.denominator > that.numerator*this.denominator
else if(this.denominator < 0 && that.denominator >= 0)
this.numerator*that.denominator > that.numerator*this.denominator
else
this.numerator*that.denominator < that.numerator*this.denominator
this.numerator*that.denominator < that.numerator*this.denominator
}
def <=(that: Rational): Boolean = {
require(this.isRational && that.isRational)
if(this.denominator >= 0 && that.denominator >= 0)
this.numerator*that.denominator <= that.numerator*this.denominator
else if(this.denominator >= 0 && that.denominator < 0)
this.numerator*that.denominator >= that.numerator*this.denominator
else if(this.denominator < 0 && that.denominator >= 0)
this.numerator*that.denominator >= that.numerator*this.denominator
else
this.numerator*that.denominator <= that.numerator*this.denominator
this.numerator*that.denominator <= that.numerator*this.denominator
}
def >(that: Rational): Boolean = {
require(this.isRational && that.isRational)
if(this.denominator >= 0 && that.denominator >= 0)
this.numerator*that.denominator > that.numerator*this.denominator
else if(this.denominator >= 0 && that.denominator < 0)
this.numerator*that.denominator < that.numerator*this.denominator
else if(this.denominator < 0 && that.denominator >= 0)
this.numerator*that.denominator < that.numerator*this.denominator
else
this.numerator*that.denominator > that.numerator*this.denominator
this.numerator*that.denominator > that.numerator*this.denominator
}
def >=(that: Rational): Boolean = {
require(this.isRational && that.isRational)
if(this.denominator >= 0 && that.denominator >= 0)
this.numerator*that.denominator >= that.numerator*this.denominator
else if(this.denominator >= 0 && that.denominator < 0)
this.numerator*that.denominator <= that.numerator*this.denominator
else if(this.denominator < 0 && that.denominator >= 0)
this.numerator*that.denominator <= that.numerator*this.denominator
else
this.numerator*that.denominator >= that.numerator*this.denominator
this.numerator*that.denominator >= that.numerator*this.denominator
}
def nonZero: Boolean = {
......@@ -98,7 +72,14 @@ case class Rational(numerator: BigInt, denominator: BigInt) {
numerator != 0
}
def isRational: Boolean = denominator != 0
def isRational: Boolean = denominator > 0
private def normalize(num: BigInt, den: BigInt): Rational = {
if(den < 0)
Rational(-num, -den)
else
Rational(num, den)
}
}
object Rational {
......
......@@ -2,6 +2,8 @@ import leon.lang._
import leon.collection._
import leon._
import scala.language.postfixOps
object RationalProps {
def squarePos(r: Rational): Rational = {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment