Skip to content

Commit

Permalink
Merge pull request #1 from lukasrieger/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
lukasrieger authored Jan 31, 2024
2 parents 15506cb + f3632f4 commit fa93725
Show file tree
Hide file tree
Showing 9 changed files with 212 additions and 20 deletions.
124 changes: 124 additions & 0 deletions .idea/uiDesigner.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

36 changes: 36 additions & 0 deletions src/main/scala/Alpha.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@

package alpha:

trait Term[E, V <: E]:
this: E =>

def free: Set[V]
def rename(re: Map[V, V]): E
def subst(su: Map[V, E]): E

def subst(v: V, e: E): E = subst(Map(v -> e))


trait X[E, V <: E] extends Term[E, V]:
this: V =>

def fresh(index: Int): V
def free: Set[V] = Set(this)
def rename(re: Map[V, V]): V = re.getOrElse(this, this)
def subst(su: Map[V, E]): E = su.getOrElse(this, this)



trait Alpha[E <: alpha.Term[E, V], V <: E with alpha.X[E, V]]:
context =>

type Term = alpha.Term[E, V]
type X = alpha.X[E, V]

trait Bind[A]:
def bound: Set[V]
def rename(a: Map[V, V], re: Map[V, V]): A
def subst(a: Map[V, V], su: Map[V, E]): A



2 changes: 1 addition & 1 deletion src/main/scala/Assert.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ enum Assert:
case SepImp(left: Assert, right: Assert)
case CoImp(left: Assert, right: Assert)
case Septract(left: Assert, right: Assert)
case PointsTo(pointer: Expression, arg: Expression)
case PointsTo(pointer: Expr, arg: Expr)
16 changes: 16 additions & 0 deletions src/main/scala/Expr.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import Expr.Var

enum Expr:
case Var(name: String, index: Option[Int] = None)



given exprShow: Show[Expr] with
override def show(value: Expr): String = value match
case Var(name, index) => s"$name$$$index"

given [Sub <: Expr] (using s: Show[Expr]) : Show[Sub] with
override def show(value: Sub): String = s.show(value)



7 changes: 0 additions & 7 deletions src/main/scala/Expression.scala

This file was deleted.

16 changes: 8 additions & 8 deletions src/main/scala/Program.scala
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import Expression.Var
import Expr.Var

enum Program:
case Assign(x: Var, expr: Expression)
case Load(x: Expression, pointer: Expression)
case Store(pointer: Expression, arg: Expression)
case Alloc(pointer: Expression)
case Free(pointer: Expression)
case Assign(x: Var, expr: Expr)
case Load(x: Expr, pointer: Expr)
case Store(pointer: Expr, arg: Expr)
case Alloc(pointer: Expr)
case Free(pointer: Expr)
case Block(programs: List[Program])
case If(test: Expression, left: Program, right: Program)
case While(test: Expression, inv: Assert, body: Program)
case If(test: Expr, left: Program, right: Program)
case While(test: Expr, inv: Assert, body: Program)
6 changes: 6 additions & 0 deletions src/main/scala/Show.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
trait Show[A]:
def show(value: A): String


extension [A: Show] (value: A)
def show: String = summon[Show[A]].show(value)
15 changes: 13 additions & 2 deletions src/main/scala/Syntax.scala
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Assert.{CoImp, PointsTo, SepAnd, SepImp, Septract}
import Program.Block

type Syntax = Syntax.type
private object Syntax:
Expand All @@ -8,8 +9,18 @@ private object Syntax:
infix def ~~> (that: Assert): Assert = CoImp(self, that)
infix def ~@ (that: Assert): Assert = Septract(self, that)

extension (expr: Expression)
infix def |->(that: Expression): Assert = PointsTo(expr, that)
extension (expr: Expr)
infix def |->(that: Expr): Assert = PointsTo(expr, that)


extension (prog: Program)
infix def `;` (next: Program): Program =
def flatten = (prog, next) match
case (_@left, Block(right)) => left :: right
case (Block(left), _@right) => left ::: List(right)
case _ => List(prog, next)

Block(flatten)


def dsl(fn: Syntax ?=> Assert): Assert =
Expand Down
10 changes: 8 additions & 2 deletions src/main/scala/main.scala
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
import Expression.Var
import Expr.Var
import Program.Free

@main
def main(): Unit = {
val test = dsl {
Var("a") |-> Var("b")
(Var("a") |-> Var("b")) ~~> (Var("c") |-> Var("d"))

Free(Var("a")) `;` Free(Var("a"))

(Var("a") |-> Var("b")) ~~> (Var("c") |-> Var("d")) ** (Var("e") |-> Var("f"))
}

println(Var("test").show)
println(test)
}

0 comments on commit fa93725

Please sign in to comment.