From e2b8b739793aeed23a721210b65a7639ba84f458 Mon Sep 17 00:00:00 2001
From: Etienne Kneuss <ekneuss@gmail.com>
Date: Fri, 24 Jul 2015 03:19:47 +0200
Subject: [PATCH] Add running example

---
 testcases/web/demos/009_Repair1.scala | 55 +++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)
 create mode 100644 testcases/web/demos/009_Repair1.scala

diff --git a/testcases/web/demos/009_Repair1.scala b/testcases/web/demos/009_Repair1.scala
new file mode 100644
index 000000000..cf4363100
--- /dev/null
+++ b/testcases/web/demos/009_Repair1.scala
@@ -0,0 +1,55 @@
+import leon.lang._
+import leon.lang.synthesis._
+import leon.collection._
+import leon.annotation._
+
+object Running {
+  abstract class Formula
+  case class And(a: Formula, b: Formula) extends Formula
+  case class Or (a: Formula, b: Formula) extends Formula
+  case class Implies(a: Formula, b: Formula) extends Formula
+  case class Not(a: Formula) extends Formula
+  case object LitFalse extends Formula
+  case object LitTrue extends Formula
+
+  def desugar(f: Formula): Formula = {
+    f match {
+      case And(a, b) =>
+        And(desugar(a), desugar(b))
+      case Or(a, b) =>
+        Or(desugar(a), desugar(b))
+      case Implies(a, b) =>
+        if (a == LitFalse) {
+          LitTrue
+        } else {
+          Or(Not(a), b)
+        }
+      case Not(Not(a)) =>
+        desugar(a)
+      case Not(a) =>
+        Not(desugar(a))
+      case f =>
+        f
+    }
+  } ensuring {
+    res => !existsImplies(res) && eval(res) == eval(f)
+  }
+
+  def existsImplies(f: Formula): Boolean = f match {
+    case Implies(a, b) => true
+    case And(a, b)     => existsImplies(a) || existsImplies(b)
+    case Or(a, b)      => existsImplies(a) || existsImplies(b)
+    case Not(a)        => existsImplies(a)
+    case _             => false
+  }
+
+  def eval(f: Formula): Boolean = f match {
+    case Implies(a, b) => !eval(a) || eval(b)
+    case And(a, b)     => eval(a) && eval(b)
+    case Or(a, b)      => eval(a) || eval(b)
+    case Not(a)        => !eval(a)
+    case LitFalse      => false
+    case LitTrue       => true
+  }
+  
+}
-- 
GitLab