From e7d46767421eca2a5afb3f9a7db8ca3fb9696baf Mon Sep 17 00:00:00 2001
From: Philippe Suter <philippe.suter@gmail.com>
Date: Tue, 12 Jul 2011 19:39:41 +0000
Subject: [PATCH] imperative send+more=money works

---
 cp-demo/PaperExamples.scala | 88 +++++++++++--------------------------
 1 file changed, 25 insertions(+), 63 deletions(-)

diff --git a/cp-demo/PaperExamples.scala b/cp-demo/PaperExamples.scala
index 9ceff1d00..e076fab9d 100644
--- a/cp-demo/PaperExamples.scala
+++ b/cp-demo/PaperExamples.scala
@@ -80,83 +80,45 @@ object PaperExamples extends App {
 
   primes.take(25).foreach(println(_))
 
-  @spec object SendMoreMoney {
-    sealed abstract class Letter
-    case class D() extends Letter
-    case class E() extends Letter
-    case class M() extends Letter
-    case class N() extends Letter
-    case class O() extends Letter
-    case class R() extends Letter
-    case class S() extends Letter
-    case class Y() extends Letter
-    val letters : List[Letter] = List(D(), E(), M(), N(), O(), R(), S(), Y())
+  object SendMoreMoney {
+    def asserting(c : Constraint0) : Unit = {
+      var entered = false
+      for(i <- c.lazyFindAll) {
+        entered = true
+      }
+      if(!entered) { throw new Exception("Asserting failed.") }
+    }
 
     def run : Unit = {
       val anyInt : Constraint1[Int] = ((n : Int) => true)
 
       val letters @ Seq(s,e,n,d,m,o,r,y) = Seq.fill(8)(anyInt.lazySolve)
-      // val s : L[Int] = anyInt.lazySolve
-      // val e : L[Int] = anyInt.lazySolve
-      // val n : L[Int] = anyInt.lazySolve
-      // val d : L[Int] = anyInt.lazySolve
-      // val m : L[Int] = anyInt.lazySolve
-      // val o : L[Int] = anyInt.lazySolve
-      // val r : L[Int] = anyInt.lazySolve
-      // val y : L[Int] = anyInt.lazySolve
-      // val letters : Seq[L[Int]] = Seq(s,e,n,d,m,o,r,y)
 
       for(l <- letters) {
-        when(l >= 0 && l <= 9) {
-          ;
-        } otherwise {
-          println("Couldn't constrain letter.")
-        }
+        asserting(l >= 0 && l <= 9) 
       }
 
+      asserting(s >= 1)
+      asserting(m >= 1) 
+
       when(distinct[Int](s,e,n,d,m,o,r,y)) {
-      // assuming(
-      //             s != e && s != n && s != d && s != m && s != o && s != r && s != y &&
-      //   e != s &&           e != n && e != d && e != m && e != o && e != r && e != y &&
-      //   n != s && n != e &&           n != d && n != m && n != o && n != r && n != y &&
-      //   d != s && d != e && d != n &&           d != m && d != o && d != r && d != y &&
-      //   m != s && m != e && m != n && m != d &&           m != o && m != r && m != y &&
-      //   o != s && o != e && o != n && o != d && o != m &&           o != r && o != y &&
-      //   r != s && r != e && r != n && r != d && r != m && r != o &&           r != y &&
-      //   y != s && y != e && y != n && y != d && y != m && y != o && y != r             )
-      // {
         println("Letters now have distinct values.")
       } otherwise {
-        println("Couldn't make it happen :(")
+        println("Letters can't have distinct values.")
       }
 
-      val solution = letters.map(_.value)
-      p("s,e,n,d,m,o,r,y", solution)
-
-      // val m = ((m : Map[Letter,Int]) => true).lazySolve
-      // for(l <- letters) {
-      //   assuming(m(l) >= 0 && m(l) <= 9) {
-      //     println("OK for " + l)
-      //   }
-
-      //   // we need this too because S and M occur as most significant digits
-      //   if (l == S() || l == M()) assuming(m(l) >= 1) {
-      //     println(l + " greater than 0  OK")
-      //   }
-      // }
-
-      // assuming( 
-      //                      1000 * m(S()) + 100 * m(E()) + 10 * m(N()) + m(D()) +
-      //                      1000 * m(M()) + 100 * m(O()) + 10 * m(R()) + m(E()) ==
-      //     10000 * m(M()) + 1000 * m(O()) + 100 * m(N()) + 10 * m(E()) + m(Y())) {
-      //   println("OK for sum")
-      // }
-
-      // assuming(distinct(m(S()), m(E()), m(N()), m(D()), m(M()), m(O()), m(R()), m(Y()))) {
-      //   println("OK for distinct")
-      // }
-      // 
-      // println("A solution : " + m.value)
+      val fstLine = anyInt.lazySolve
+      val sndLine = anyInt.lazySolve
+      val total = anyInt.lazySolve
+
+      asserting(fstLine == 1000*s + 100*e + 10*n + d)
+      asserting(sndLine == 1000*m + 100*o + 10*r + e)
+      asserting(total   == 10000*m + 1000*o + 100*n + 10*e + y)
+      when(total == fstLine + sndLine) {
+        println("The puzzle has a solution : " + letters.map(_.value))
+      } otherwise {
+        println("The puzzle has no solution.")
+      }
     }
   }
 
-- 
GitLab