-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Jake Donham
committed
May 27, 2011
1 parent
08b5a6d
commit f2a6e8f
Showing
3 changed files
with
101 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
trait Scrolog { | ||
val LogicState: LogicState | ||
import LogicState._ | ||
|
||
type P = T[Env,Unit] | ||
|
||
class TermSyntax[A](t: Term[A]) { | ||
def =:=(t2: Term[A]): P = | ||
for { | ||
env <- get | ||
env2 <- { | ||
t.subst(env).unify(env, t2.subst(env)) match { | ||
case None => fail[Env,Unit] | ||
case Some(e) => set(e) | ||
} | ||
} | ||
} yield env2 | ||
} | ||
|
||
def printEnv: P = for (env <- get) yield Console.println(env) | ||
def println(m: String): P = unit(Console.println(m)) | ||
|
||
implicit def termSyntax[A](t: Term[A]) = new TermSyntax(t) | ||
implicit def varTermSyntax[A](t: VarTerm[A]) = new TermSyntax(t) | ||
implicit def litTermSyntax[A](t: LitTerm[A]) = new TermSyntax(t) | ||
implicit def tuple2TermSyntax[A,B](t: Tuple2Term[A,B]) = new TermSyntax(t) | ||
implicit def nilTermSyntax[A](t: NilTerm[A]) = new TermSyntax(t) | ||
implicit def consTermSyntax[A](t: ConsTerm[A]) = new TermSyntax(t) | ||
|
||
implicit def syntax[A](t: P) = LogicState.syntax(t) | ||
|
||
def run[A](t: P, n: Int, tm: Term[A]): List[Term[A]] = | ||
LogicState.run(Env.empty, t, n).map({ case (e, _) => tm.subst(e) }) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,58 @@ | ||
object Test { | ||
import Term._ | ||
import LogicStateSKE._ | ||
import Term._ | ||
|
||
def member[A](x: Term[A], l: Term[List[A]]): T[Env,Unit] = { | ||
trait Test { | ||
val Scrolog: Scrolog | ||
import Scrolog._ | ||
|
||
def member[A](x: Term[A], l: Term[List[A]]): P = { | ||
val hd = Evar[A]("hd"); val tl = Evar[List[A]]("tl") | ||
ConsTerm(hd, tl) =!= l & | ||
(x =!= hd | member(x, tl)) | ||
ConsTerm(hd, tl) =:= l & | ||
(x =:= hd | member(x, tl)) | ||
} | ||
|
||
sealed trait Nat | ||
case object Z extends Nat | ||
case class S(n: Nat) extends Nat | ||
|
||
case object ZTerm extends Term[Nat] { | ||
def unify(e: Env, t: Term[Nat]) = | ||
t match { | ||
case ZTerm => Some(e) | ||
case _: VarTerm[_] => t.unify(e, this) | ||
case _ => None | ||
} | ||
|
||
def occurs[A](v: Evar[A]) = false | ||
def subst(e: Env) = this | ||
def ground(e: Env) = Z | ||
|
||
override def toString = { Z.toString } | ||
} | ||
|
||
case class STerm(n: Term[Nat]) extends Term[Nat] { | ||
def unify(e: Env, t: Term[Nat]) = | ||
t match { | ||
case STerm(n2) => n.unify(e, n2) | ||
case _: VarTerm[_] => t.unify(e, this) | ||
case _ => None | ||
} | ||
|
||
def occurs[A](v: Evar[A]) = n.occurs(v) | ||
def subst(e: Env) = STerm(n.subst(e)) | ||
def ground(e: Env) = S(n.ground(e)) | ||
|
||
override def toString = { "S(" + n.toString + ")" } | ||
} | ||
|
||
implicit def nat2Term(n: Nat): Term[Nat] = | ||
n match { | ||
case Z => ZTerm | ||
case S(n) => STerm(nat2Term(n)) | ||
} | ||
|
||
def sum(m: Term[Nat], n: Term[Nat], p: Term[Nat]): P = { | ||
val m2 = Evar[Nat]("m2"); val p2 = Evar[Nat]("p2") | ||
(m =:= Z & n =:= p) | | ||
(m =:= STerm(m2) & p =:= STerm(p2) & sum(m2, n, p2)) | ||
} | ||
} |