Skip to content

Commit d668749

Browse files
committed
Fixed type check problem with generic types
1 parent a10c19b commit d668749

File tree

8 files changed

+39
-41
lines changed

8 files changed

+39
-41
lines changed

src/algebraic/manipulator/Environment.scala

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@ trait Environment extends Element {
44
val path: List[String]
55
val base: Environment = this
66
val names: Set[String] = Set.empty
7-
def apply[E <: Element](name: String, predicate: E => Boolean = (_:E) => true): Option[E] = None
7+
def apply(name: String, predicate: Element => Boolean): Option[Element] = None
88
def contains(name: String): Boolean = names.contains(name)
9-
def find[E <: Element](path: List[String], predicate: E => Boolean = (_:E) => true): Option[E]
10-
def toFull[E <: Element](path: List[String], predicate: E => Boolean = (_:E) => true): Option[List[String]]
9+
def find(path: List[String], predicate: Element => Boolean): Option[Element]
10+
def toFull(path: List[String], predicate: Element => Boolean): Option[List[String]]
1111

1212
override def filter(predicate: Element => Boolean): Traversable[Element] = None
1313
override def validate(env: Environment): Traversable[(List[String], String)] = None
1414

15-
def apply[E <: Element](path: List[String], predicate: E => Boolean): Option[E] =
15+
def apply(path: List[String], predicate: Element => Boolean): Option[Element] =
1616
if (path.tail.isEmpty) apply(path.head, predicate)
17-
else this.apply(path.head, (_: Environment) => true).flatMap(_[E](path.tail, predicate))
17+
else apply(path.head, (_:Element).isInstanceOf[Environment]).flatMap(_.asInstanceOf[Environment](path.tail, predicate))
1818

1919
def scope(name: String): Environment = Environment.Scope(this, name)
2020
def ++(params: List[Definition]): Environment = ++(params.map(_.name).toSet)
@@ -28,29 +28,29 @@ object Environment {
2828

2929
case object Empty extends Environment {
3030
override val path: List[String] = Nil
31-
override def find[E <: Element](path: List[String], predicate: E => Boolean): Option[E] = None
32-
override def toFull[E <: Element](path: List[String], predicate: E => Boolean): Option[List[String]] = None
31+
override def find(path: List[String], predicate: Element => Boolean): Option[Element] = None
32+
override def toFull(path: List[String], predicate: Element => Boolean): Option[List[String]] = None
3333
}
3434

3535
case class Scope(parent: Environment, name: String) extends Environment {
3636
override val path: List[String] = parent.path :+ name
37-
override def find[E <: Element](path: List[String], predicate: E => Boolean): Option[E] = parent.find(path, predicate)
38-
override def toFull[E <: Element](path: List[String], predicate: E => Boolean): Option[List[String]] = parent.toFull(path, predicate)
37+
override def find(path: List[String], predicate: Element => Boolean): Option[Element] = parent.find(path, predicate)
38+
override def toFull(path: List[String], predicate: Element => Boolean): Option[List[String]] = parent.toFull(path, predicate)
3939
}
4040

4141
case class Compound(env: Environment, key: String, element: Element) extends Environment {
4242
override val path: List[String] = env.path
4343
override val base: Environment = env.base
4444
override val names: Set[String] = env.names + key
4545

46-
override def apply[E <: Element](name: String, predicate: E => Boolean): Option[E] =
47-
Some(element).filter(e => name == key && e.isInstanceOf[E]).map(_.asInstanceOf[E])
46+
override def apply(name: String, predicate: Element => Boolean): Option[Element] =
47+
Some(element).filter(e => name == key && predicate(e))
4848
.orElse(env(name, predicate))
4949

50-
override def find[E <: Element](path: List[String], predicate: E => Boolean): Option[E] =
50+
override def find(path: List[String], predicate: Element => Boolean): Option[Element] =
5151
apply(path, predicate).orElse(base.find(path, predicate))
5252

53-
override def toFull[E <: Element](path: List[String], predicate: E => Boolean): Option[List[String]] =
53+
override def toFull(path: List[String], predicate: Element => Boolean): Option[List[String]] =
5454
Some(this.path ++ path).filter(_ => path.head == key && apply(path, predicate).isDefined)
5555
.orElse(env.toFull(path, predicate))
5656

src/algebraic/manipulator/WorkFile.scala

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,17 @@ package algebraic.manipulator
33
class WorkFile(parent: Environment, name: String, val using: Map[String, List[String]], val imports: Set[Environment]) extends Environment {
44
override val path: List[String] = parent.path :+ name
55

6-
override def find[E <: Element](path: List[String], predicate: E => Boolean): Option[E] =
7-
using.get(path.head).flatMap(parent.find[Element](_)).flatMap{
6+
override def find(path: List[String], predicate: Element => Boolean): Option[Element] =
7+
using.get(path.head).flatMap(parent.find(_, _ => true)).flatMap{
88
case env: Environment if path.tail.nonEmpty => env(path.tail, predicate)
9-
case e: E => Some(e).filter(predicate)
10-
case _ => None
11-
}.orElse((Option.empty[E] /: imports)(_ orElse _(path, predicate)))
9+
case e => Some(e).filter(predicate)
10+
}.orElse((Option.empty[Element] /: imports)(_ orElse _(path, predicate)))
1211
.orElse(parent.find(path, predicate))
1312

14-
override def toFull[E <: Element](path: List[String], predicate: E => Boolean): Option[List[String]] =
15-
using.get(path.head).flatMap(parent.find[Element](_)).flatMap{
13+
override def toFull(path: List[String], predicate: Element => Boolean): Option[List[String]] =
14+
using.get(path.head).flatMap(parent.find(_, _ => true)).flatMap{
1615
case env: Environment if path.tail.nonEmpty => env(path.tail, predicate).map(_ => env.path ++ path.tail)
17-
case e: E => Some(e).filter(predicate).flatMap(_ => parent.toFull(using(path.head)))
18-
case _ => None
16+
case e => Some(e).filter(predicate).flatMap(_ => parent.toFull(using(path.head), predicate))
1917
}.orElse(imports.find(i => i.contains(path.head) && i(path, predicate).isDefined).map(_.path ++ path))
2018
.orElse(parent.toFull(path, predicate))
2119
}

src/algebraic/manipulator/latex/LatexWriter.scala

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ object LatexWriter {
168168
def getInputColors(env: Environment, exps: List[Exp], manipulation: Manipulation): PathTree[String] = manipulation match {
169169
case Call(_, _) => PathTree.empty
170170
case Substitute(positions, path, from, _, _) =>
171-
val identity = env.find[Substitutable](path).get.asInstanceOf[Identity]
171+
val identity = env.find(path, _.isInstanceOf[Substitutable]).get.asInstanceOf[Identity]
172172
val parameters = identity.header.parameters.map(_.variable)
173173
positions :: identity.result(from).tree.filter(parameters.contains).map(parameters.indexOf(_)).map(colors)
174174
case Rename(positions, _, _) => positions :> colors.head
@@ -179,7 +179,7 @@ object LatexWriter {
179179
def getOutputColors(env: Environment, exps: List[Exp], manipulation: Manipulation): PathTree[String] = manipulation match {
180180
case Call(_, _) => PathTree.empty
181181
case Substitute(positions, path, _, to, _) =>
182-
val identity = env.find[Substitutable](path).get.asInstanceOf[Identity]
182+
val identity = env.find(path, _.isInstanceOf[Substitutable]).get.asInstanceOf[Identity]
183183
val parameters = identity.header.parameters.map(_.variable)
184184
positions :: identity.result(to).tree.filter(parameters.contains).map(parameters.indexOf(_)).map(colors)
185185
case Rename(positions, _, _) => positions :> colors.head
@@ -190,12 +190,12 @@ object LatexWriter {
190190
def writeManipulation(env: Environment, manipulation: Manipulation): String = manipulation match {
191191
case Call(temp, exp) => s"Call $$${writeExp(exp, exp.tree.filter(_ == temp).map(_ => colors.head))}$$"
192192
case Substitute(_, path, from, to, _) =>
193-
val identity = env.find[Substitutable](path).get.asInstanceOf[Identity]
194-
writeIdentityReference(env.toFull[Substitutable](path).get, identity.header, List(from, to).map(identity.result))
193+
val identity = env.find(path, _.isInstanceOf[Substitutable]).get.asInstanceOf[Identity]
194+
writeIdentityReference(env.toFull(path, _.isInstanceOf[Substitutable]).get, identity.header, List(from, to).map(identity.result))
195195
case Rename(_, from, to) => s"Renaming $from to $to"
196-
case Wrap(Variable(name), _) => env.find[Wrapable](List(name)).head match {
197-
case SimpleObject(exp) => writeIdentityReference(env.toFull[Wrapable](List(name)).get, Header(Nil, Nil, Nil), List(Variable(name), exp))
198-
case SimpleFunction(header, exp) => writeIdentityReference(env.toFull[Wrapable](List(name)).get, header, List(Operation(Variable(name), header.parameters.map(_.variable)), exp))
196+
case Wrap(Variable(name), _) => env.find(List(name), _.isInstanceOf[Wrapable]).get match {
197+
case SimpleObject(exp) => writeIdentityReference(env.toFull(List(name), _.isInstanceOf[Wrapable]).get, Header(Nil, Nil, Nil), List(Variable(name), exp))
198+
case SimpleFunction(header, exp) => writeIdentityReference(env.toFull(List(name), _.isInstanceOf[Wrapable]).get, header, List(Operation(Variable(name), header.parameters.map(_.variable)), exp))
199199
}
200200
case Wrap(Lambda(params, e), _) =>
201201
s"Wrapping $$${params.map(writeExp(_)).mkString("(", ", ", ")")} \\rightarrow ${writeExp(e)}$$"

src/algebraic/manipulator/manipulation/Substitute.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ case class Substitute(positions: Tree, path: List[String], from: Int, to: Int, s
77
override def dependencies: Set[String] = Set(path.head)
88

99
override def replace(env: Environment, exp: Exp): Exp = {
10-
val (identity, headMatch) = env.find[Substitutable](path).get.substitute(specifiers)
10+
val (identity, headMatch) = env.find(path, _.isInstanceOf[Substitutable]).get.asInstanceOf[Substitutable].substitute(specifiers)
1111

1212
val fromExp = identity(from)
1313

src/algebraic/manipulator/manipulation/Unwrap.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ case class Unwrap(positions: Tree) extends PathManipulation(positions) {
66
override def dependencies: Set[String] = Set.empty
77

88
override def replace(env: Environment, exp: Exp): Exp = exp match {
9-
case Variable(name) => env.find[Wrapable](List(name)).get.unwrap(exp)
10-
case Operation(Variable(name), _) => env.find[Wrapable](List(name)).get.unwrap(exp)
9+
case Variable(name) => env.find(List(name), _.isInstanceOf[Wrapable]).get.asInstanceOf[Wrapable].unwrap(exp)
10+
case Operation(Variable(name), _) => env.find(List(name), _.isInstanceOf[Wrapable]).get.asInstanceOf[Wrapable].unwrap(exp)
1111
case Operation(Lambda(params, value), args) =>
1212
if (params.length != args.length)
1313
throw new IllegalArgumentException(s"Expected ${params.length} arguments, but received ${args.length}")

src/algebraic/manipulator/manipulation/Wrap.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ case class Wrap(wrapper: Exp, positions: Tree) extends PathManipulation(position
66
override def dependencies: Set[String] = wrapper.dependencies
77

88
override def replace(env: Environment, exp: Exp): Exp = wrapper match {
9-
case Operation(Variable(name), _) => env.find[Wrapable](List(name)).get.wrap(wrapper, exp)
10-
case Variable(name) => env.find[Wrapable](List(name)).get.wrap(wrapper, exp)
9+
case Operation(Variable(name), _) => env.find(List(name), _.isInstanceOf[Wrapable]).get.asInstanceOf[Wrapable].wrap(wrapper, exp)
10+
case Variable(name) => env.find(List(name), _.isInstanceOf[Wrapable]).get.asInstanceOf[Wrapable].wrap(wrapper, exp)
1111
case Lambda(params, value) =>
1212
try {
1313
val re = value.matchExp(exp, HeadMatch(Map.empty, Map.empty, params.map(v => Definition(AnyType, v) -> None).toMap))

src/algebraic/manipulator/read/FileTemplate.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ case class FileTemplate(path: List[String], using: Map[String, List[String]], im
1717

1818
def apply(name: String, env: Environment): Element = {
1919
try {
20-
var file: Environment = new WorkFile(env, name, using, imports.flatMap(env.find[Environment](_)))
20+
var file: Environment = new WorkFile(env, name, using, imports.flatMap(env.find(_, _.isInstanceOf[Environment]).map(_.asInstanceOf[Environment])))
2121
identities.foreach{
2222
case (key, ide) =>
2323
try {

work/calculus/Diff.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ prove ide Line<x>(Complex x) {
169169
diff(x -> x)(x) = 1
170170
}
171171

172-
prove ide DiffLn(Complex x) {
172+
prove ide Ln(Complex x) {
173173
let 2 diff(ln)(x)
174174
substitute Definition<h>:1
175175
substitute ~Ln.DistributeSub:1,1,0,0;
@@ -194,13 +194,13 @@ prove ide DiffLn(Complex x) {
194194
diff(ln)(x) = div(1,x)
195195
}
196196

197-
prove ide DiffLog<x>(Complex a, Complex x) {
197+
prove ide Log<x>(Complex a, Complex x) {
198198
let 2 diff(x -> log(a,x))(x)
199199
substitute Ln.ChangeBase:1,-1,0,0;
200200
substitute Div.AsMult:1,-1,0,0;
201201
substitute Mult.Commute:1,-1,0,0;
202202
substitute Factor:1;
203-
substitute DiffLn:1,1;
203+
substitute Ln:1,1;
204204
substitute ~Div.AsMult:1;
205205
substitute Div.Commute[0->2]:1;
206206
} result {
@@ -213,7 +213,7 @@ prove ide Exp<x>(Complex x) {
213213
wrap x -> pow(e,x):0,-1,0,0,0
214214
substitute Chain:0
215215
unwrap:0,0,0
216-
substitute DiffLn:0,0
216+
substitute Ln:0,0
217217
substitute Line:1
218218
substitute Mult.Commute:0
219219
substitute ~Div.AsMult:0
@@ -244,7 +244,7 @@ prove ide Exponential<x>(Complex a, Complex x) {
244244
diff(x -> pow(a,x))(x) = mult(ln(a),pow(a,x))
245245
}
246246

247-
prove ide DiffPow<x>(Complex n, Complex x) {
247+
prove ide Pow<x>(Complex n, Complex x) {
248248
let 2 diff(x -> pow(x,n))(x)
249249
substitute ~Ln.PowLn:1,-1,0,0,0
250250
substitute Pow.Combine:1,-1,0,0
@@ -254,7 +254,7 @@ prove ide DiffPow<x>(Complex n, Complex x) {
254254
unwrap:1,0,0
255255
substitute Mult.Commute:1,1,-1,0,0
256256
substitute Factor:1,1
257-
substitute DiffLn:1,1,1
257+
substitute Ln:1,1,1
258258
substitute Exp:1,0
259259
substitute ~Mult.Associate:1
260260
substitute Mult.Commute:1,0

0 commit comments

Comments
 (0)