diff --git a/testcases/proof/proba/Coins.scala b/testcases/proof/proba/Coins.scala index c85893820fb157ba73a6961ba428af916e42eeea..1d2687a4a0f14bee09c048403dd3c45d090a9e5e 100644 --- a/testcases/proof/proba/Coins.scala +++ b/testcases/proof/proba/Coins.scala @@ -119,12 +119,12 @@ object Coins { def sum(coin1: CoinDist, coin2: CoinDist): CoinDist = { require(isDist(coin1) && isDist(coin2)) CoinDist(coin1.pHead*coin2.pHead + coin1.pTail*coin2.pTail) - } ensuring(res => res.pTail == (coin1.pHead*coin2.pTail + coin1.pTail*coin2.pHead)) + } ensuring(res => isDist(res) && res.pTail == (coin1.pHead*coin2.pTail + coin1.pTail*coin2.pHead)) def sum(dist: CoinsJoinDist): CoinDist = { require(isDist(dist)) CoinDist(dist.hh + dist.tt) - } ensuring(res => res.pTail == (dist.ht + dist.th)) + } ensuring(res => isDist(res) && res.pTail == (dist.ht + dist.th)) @@ -133,73 +133,73 @@ object Coins { * properties of sum operation * ***************************************************/ - //def sumIsUniform1(coin1: CoinDist, coin2: CoinDist): Boolean = { - // require(isDist(coin1) && isDist(coin2) && isUniform(coin1) && isUniform(coin2)) - // val dist = sum(coin1, coin2) - // isUniform(dist) - //} holds + def sumIsUniform1(coin1: CoinDist, coin2: CoinDist): Boolean = { + require(isDist(coin1) && isDist(coin2) && isUniform(coin1) && isUniform(coin2)) + val dist = sum(coin1, coin2) + isUniform(dist) + } holds - //def sumIsUniform2(coin1: CoinDist, coin2: CoinDist): Boolean = { - // require(isDist(coin1) && isDist(coin2) && isUniform(coin1)) - // val dist = sum(coin1, coin2) - // isUniform(dist) - //} holds + def sumIsUniform2(coin1: CoinDist, coin2: CoinDist): Boolean = { + require(isDist(coin1) && isDist(coin2) && isUniform(coin1)) + val dist = sum(coin1, coin2) + isUniform(dist) + } holds - //def sumUniform3(coin1: CoinDist, coin2: CoinDist, coin3: CoinDist): Boolean = { - // require(isDist(coin1) && isDist(coin2) && isDist(coin3) && isUniform(coin1)) - // val dist = sum(sum(coin1, coin2), coin3) - // isUniform(dist) - //} holds + def sumUniform3(coin1: CoinDist, coin2: CoinDist, coin3: CoinDist): Boolean = { + require(isDist(coin1) && isDist(coin2) && isDist(coin3) && isUniform(coin1)) + val dist = sum(sum(coin1, coin2), coin3) + isUniform(dist) + } holds - //def sumUniformWithIndependence(dist: CoinsJoinDist): Boolean = { - // require(isDist(dist) && isIndependent(dist) && (isUniform(firstCoin(dist)) || isUniform(secondCoin(dist)))) - // val res = sum(dist) - // isUniform(res) - //} holds + def sumUniformWithIndependence(dist: CoinsJoinDist): Boolean = { + require(isDist(dist) && isIndependent(dist) && (isUniform(firstCoin(dist)) || isUniform(secondCoin(dist)))) + val res = sum(dist) + isUniform(res) + } holds - ////should find counterexample, indepenence is required - //def sumUniformWithoutIndependence(dist: CoinsJoinDist): Boolean = { - // require(isDist(dist) && (isUniform(firstCoin(dist)) || isUniform(secondCoin(dist)))) - // val res = sum(dist) - // isUniform(res) - //} holds + //should find counterexample, indepenence is required + def sumUniformWithoutIndependence(dist: CoinsJoinDist): Boolean = { + require(isDist(dist) && (isUniform(firstCoin(dist)) || isUniform(secondCoin(dist)))) + val res = sum(dist) + isUniform(res) + } holds ////sum of two non-uniform dices is potentially uniform (no result) - //def sumNonUniform1(coin1: CoinDist, coin2: CoinDist): Boolean = { - // require(isDist(coin1) && isDist(coin2) && !isUniform(coin1) && !isUniform(coin2)) - // val dist = sum(coin1, coin2) - // !isUniform(dist) - //} holds + def sumNonUniform1(coin1: CoinDist, coin2: CoinDist): Boolean = { + require(isDist(coin1) && isDist(coin2) && !isUniform(coin1) && !isUniform(coin2)) + val dist = sum(coin1, coin2) + !isUniform(dist) + } holds - //def sumNonUniform2(coin1: CoinDist, coin2: CoinDist, coin3: CoinDist): Boolean = { - // require(isDist(coin1) && isDist(coin2) && isDist(coin3) && !isUniform(coin1) && !isUniform(coin2) && !isUniform(coin3)) - // val dist = sum(sum(coin1, coin2), coin3) - // !isUniform(dist) - //} //holds + def sumNonUniform2(coin1: CoinDist, coin2: CoinDist, coin3: CoinDist): Boolean = { + require(isDist(coin1) && isDist(coin2) && isDist(coin3) && !isUniform(coin1) && !isUniform(coin2) && !isUniform(coin3)) + val dist = sum(sum(coin1, coin2), coin3) + !isUniform(dist) + } holds - //def sumNonUniformWithIndependence(dist: CoinsJoinDist): Boolean = { - // require(isDist(dist) && isIndependent(dist) && !isUniform(firstCoin(dist)) && !isUniform(secondCoin(dist))) - // val res = sum(dist) - // !isUniform(res) - //} holds + def sumNonUniformWithIndependence(dist: CoinsJoinDist): Boolean = { + require(isDist(dist) && isIndependent(dist) && !isUniform(firstCoin(dist)) && !isUniform(secondCoin(dist))) + val res = sum(dist) + !isUniform(res) + } holds - ////independence is required - //def sumNonUniformWithoutIndependence(dist: CoinsJoinDist): Boolean = { - // require(isDist(dist) && !isUniform(firstCoin(dist)) && !isUniform(secondCoin(dist))) - // val res = sum(dist) - // !isUniform(res) - //} holds + //independence is required + def sumNonUniformWithoutIndependence(dist: CoinsJoinDist): Boolean = { + require(isDist(dist) && !isUniform(firstCoin(dist)) && !isUniform(secondCoin(dist))) + val res = sum(dist) + !isUniform(res) + } holds - //def sumIsCommutative(coin1: CoinDist, coin2: CoinDist, coin3: CoinDist): Boolean = { - // require(isDist(coin1) && isDist(coin2)) - // sum(coin1, coin2) == sum(coin2, coin1) - //} holds + def sumIsCommutative(coin1: CoinDist, coin2: CoinDist, coin3: CoinDist): Boolean = { + require(isDist(coin1) && isDist(coin2)) + sum(coin1, coin2) == sum(coin2, coin1) + } holds - //def sumIsAssociative(coin1: CoinDist, coin2: CoinDist, coin3: CoinDist): Boolean = { - // require(isDist(coin1) && isDist(coin2) && isDist(coin3)) - // sum(sum(coin1, coin2), coin3) == sum(coin1, sum(coin2, coin3)) - //} //holds + def sumIsAssociative(coin1: CoinDist, coin2: CoinDist, coin3: CoinDist): Boolean = { + require(isDist(coin1) && isDist(coin2) && isDist(coin3)) + sum(sum(coin1, coin2), coin3) == sum(coin1, sum(coin2, coin3)) + } holds }