Updated API sources from the latest version of Logic. Adapted to the new API. Invocation/occurrence arguments.

This commit is contained in:
Fedor Isakov 2016-01-13 23:09:24 +01:00
parent bedb9592a0
commit 3cf3f4b21d
11 changed files with 64 additions and 31 deletions

View File

@ -5,6 +5,6 @@ package jetbrains.mps.logic.reactor.logical;
public interface LogicalContext {
public <V> V valueFor(LogicalPattern<V> logicalPattern);
public <V> Logical<V> variable(LogicalPattern<V> logicalPattern);
}

View File

@ -146,7 +146,7 @@
</root>
<root nodeRef="r:7365f7fe-12e6-4229-8901-f6dc6d5df03f(jetbrains.mps.logic.reactor.logical)/8907901911298493091">
<file name="LogicalContext.java">
<node id="8907901911298493118" at="8,0,9,0" concept="3" trace="valueFor#(Ljetbrains/mps/logic/reactor/logical/LogicalPattern;)null" />
<node id="8907901911298493118" at="8,0,9,0" concept="3" trace="variable#(Ljetbrains/mps/logic/reactor/logical/LogicalPattern;)Ljetbrains/mps/logic/reactor/logical/Logical;" />
<scope id="8907901911298493118" at="8,0,9,0">
<var name="logicalPattern" id="8907901911298493173" />
</scope>

View File

@ -3,6 +3,8 @@ package jetbrains.mps.logic.reactor.program;
/*Generated by MPS */
import java.util.List;
import java.util.Collection;
import jetbrains.mps.logic.reactor.logical.LogicalContext;
/**
* A constraint provided by a handler. Can only be told.
@ -13,4 +15,5 @@ public interface Constraint extends AndItem {
public List<Class<?>> argumentTypes();
public Collection<?> occurrenceArguments(LogicalContext logicalContext);
}

View File

@ -2,6 +2,8 @@ package jetbrains.mps.logic.reactor.program;
/*Generated by MPS */
import java.util.Collection;
import jetbrains.mps.logic.reactor.logical.LogicalContext;
/**
* A predicate that is provided by a solver. Can be either told or asked.
@ -10,4 +12,7 @@ public interface Predicate extends AndItem {
public PredicateSymbol symbol();
public Collection<?> invocationArguments(LogicalContext logicalContext);
}

View File

@ -178,18 +178,26 @@
</root>
<root nodeRef="r:f43ee4a0-488a-425a-87a0-594ab3b0d15f(jetbrains.mps.logic.reactor.program)/7785665572546345623">
<file name="Constraint.java">
<node id="6317379717814333032" at="12,0,13,0" concept="6" trace="symbol#()Ljetbrains/mps/logic/reactor/program/ConstraintSymbol;" />
<node id="8225968737376931639" at="14,0,15,0" concept="6" trace="argumentTypes#()Ljava/util/List;" />
<scope id="6317379717814333032" at="12,0,13,0" />
<scope id="8225968737376931639" at="14,0,15,0" />
<unit id="7785665572546345623" at="10,0,17,0" name="jetbrains.mps.logic.reactor.program.Constraint" />
<node id="6317379717814333032" at="14,0,15,0" concept="6" trace="symbol#()Ljetbrains/mps/logic/reactor/program/ConstraintSymbol;" />
<node id="8225968737376931639" at="16,0,17,0" concept="6" trace="argumentTypes#()Ljava/util/List;" />
<node id="5649815580023740085" at="18,0,19,0" concept="6" trace="occurrenceArguments#(Ljetbrains/mps/logic/reactor/logical/LogicalContext;)Ljava/util/Collection;" />
<scope id="6317379717814333032" at="14,0,15,0" />
<scope id="8225968737376931639" at="16,0,17,0" />
<scope id="5649815580023740085" at="18,0,19,0">
<var name="logicalContext" id="5649815580024092231" />
</scope>
<unit id="7785665572546345623" at="12,0,20,0" name="jetbrains.mps.logic.reactor.program.Constraint" />
</file>
</root>
<root nodeRef="r:f43ee4a0-488a-425a-87a0-594ab3b0d15f(jetbrains.mps.logic.reactor.program)/7785665572546359770">
<file name="Predicate.java">
<node id="7785665572546360338" at="11,0,12,0" concept="6" trace="symbol#()Ljetbrains/mps/logic/reactor/program/PredicateSymbol;" />
<scope id="7785665572546360338" at="11,0,12,0" />
<unit id="7785665572546359770" at="9,0,14,0" name="jetbrains.mps.logic.reactor.program.Predicate" />
<node id="7785665572546360338" at="13,0,14,0" concept="6" trace="symbol#()Ljetbrains/mps/logic/reactor/program/PredicateSymbol;" />
<node id="5649815580025803455" at="15,0,16,0" concept="6" trace="invocationArguments#(Ljetbrains/mps/logic/reactor/logical/LogicalContext;)Ljava/util/Collection;" />
<scope id="7785665572546360338" at="13,0,14,0" />
<scope id="5649815580025803455" at="15,0,16,0">
<var name="logicalContext" id="5649815580025803456" />
</scope>
<unit id="7785665572546359770" at="11,0,19,0" name="jetbrains.mps.logic.reactor.program.Predicate" />
</file>
</root>
<root nodeRef="r:f43ee4a0-488a-425a-87a0-594ab3b0d15f(jetbrains.mps.logic.reactor.program)/8335224865064895074">

View File

@ -136,26 +136,19 @@ class Handler {
}
private fun AndItem.argumentValues(context: LogicalContext): List<Any> =
arguments().map { arg -> if (arg is LogicalPattern<*>) context.valueFor(arg) else arg!! }.toList()
private fun Constraint.occurrence(handler: Handler, context: LogicalContext): ConstraintOccurrence =
MemConstraintOccurrence(handler, this, argumentValues(context))
private val noLogicalContext: LogicalContext = object: LogicalContext {
override fun <V : Any?> valueFor(logicalPattern: LogicalPattern<V>): V? = null
override fun <V : Any> variable(logicalPattern: LogicalPattern<V>): Logical<V> = TODO()
}
private fun Constraint.occurrence(handler: Handler, context: LogicalContext): ConstraintOccurrence =
MemConstraintOccurrence(handler, this, occurrenceArguments(context))
private fun Predicate.invocation(logicalContext: LogicalContext): PredicateInvocation {
return object: PredicateInvocation {
private fun Predicate.invocation(logicalContext: LogicalContext): PredicateInvocation = object: PredicateInvocation {
override fun predicate(): Predicate = this@invocation
override fun arguments(): Collection<Any> = argumentValues(logicalContext)
override fun arguments(): Collection<*> = invocationArguments(logicalContext)
}
}
fun ConstraintOccurrence.terminate() {
if (this is MemConstraintOccurrence) {
@ -163,7 +156,7 @@ fun ConstraintOccurrence.terminate() {
}
}
private data class MemConstraintOccurrence(val handler: Handler, val constraint: Constraint, val arguments: List<Any>, val id: Int) :
private data class MemConstraintOccurrence(val handler: Handler, val constraint: Constraint, val arguments: List<*>, val id: Int) :
ConstraintOccurrence,
LogicalValueObserver
{
@ -174,8 +167,8 @@ private data class MemConstraintOccurrence(val handler: Handler, val constraint:
val random = Random()
}
constructor(handler: Handler, constraint: Constraint, arguments: List<Any>) :
this(handler, constraint, arguments, random.nextInt())
constructor(handler: Handler, constraint: Constraint, arguments: Collection<*>) :
this(handler, constraint, ArrayList(arguments), random.nextInt())
{
for (a in arguments) {
if (a is Logical<*>) {
@ -186,7 +179,7 @@ private data class MemConstraintOccurrence(val handler: Handler, val constraint:
override fun constraint(): Constraint = constraint
override fun arguments(): Collection<Any> = arguments
override fun arguments(): Collection<*> = arguments
override fun valueUpdated(logical: Logical<*>) {
handler.queue(this)

View File

@ -26,6 +26,8 @@ internal fun Logical<*>.removeObserver(observer: LogicalValueObserver) {
fun <V> LogicalPattern<V>.logical(): Logical<V> = MemLogical<V>(name())
fun <V> LogicalPattern<V>.logical(value: V): Logical<V> = MemLogical<V>(name(), value)
class MemLogical<T> : SolverLogical<T> {
companion object {
@ -53,6 +55,11 @@ class MemLogical<T> : SolverLogical<T> {
this.name = name
}
constructor(name: String, value: T) {
this.name = name
this._value = value
}
constructor(pattern: LogicalPattern<T>) {
this.pattern = pattern
this.name = pattern.name()

View File

@ -1,6 +1,8 @@
package program
import jetbrains.mps.logic.reactor.evaluation.ConstraintOccurrence
import jetbrains.mps.logic.reactor.logical.LogicalContext
import jetbrains.mps.logic.reactor.logical.LogicalPattern
import jetbrains.mps.logic.reactor.program.Constraint
import jetbrains.mps.logic.reactor.program.ConstraintSymbol
import java.util.*
@ -15,6 +17,11 @@ data class MemConstraint(val symbol: ConstraintSymbol, val arguments: List<Any>)
override fun arguments(): List<Any> = arguments
override fun occurrenceArguments(logicalContext: LogicalContext): Collection<*> = arguments.map { a ->
if (a is LogicalPattern<*>) logicalContext.variable(a)
else a
}
override fun symbol(): ConstraintSymbol = symbol
override fun argumentTypes(): List<Class<*>> = arguments.map { arg -> arg.javaClass }

View File

@ -97,6 +97,10 @@ data class TestJavaPredicate(val symbol: JavaPredicateSymbol, val expr: JavaExpr
override fun symbol(): PredicateSymbol = symbol
override fun invocationArguments(logicalContext: LogicalContext): Collection<*> = args.map { a ->
if (a is LogicalPattern<*>) logicalContext.variable(a)
else a
}
}

View File

@ -49,4 +49,9 @@ data class TestEqPredicate(val left: Any, val right: Any) : Predicate {
override fun symbol(): PredicateSymbol = PredicateSymbol("equals", 2)
override fun invocationArguments(logicalContext: LogicalContext): Collection<*> = listOf(left, right).map { a ->
if (a is LogicalPattern<*>) logicalContext.variable(a)
else a
}
}

View File

@ -194,10 +194,10 @@ class TestMatcher {
)
)
).matcher().lookupMatches(occurrence("foo", "blah", b)).first().run {
assertEquals("blah", logicalContext().valueFor(A))
assertSame(b, logicalContext().valueFor(B))
assertEquals(C.logical().name(), (logicalContext().valueFor(C) as Logical<*>).name())
assertEquals(C.logical().pattern(), (logicalContext().valueFor(C) as Logical<*>).pattern())
assertEquals("blah", logicalContext().variable(A).findRoot().value())
assertSame(b, logicalContext().variable(B))
assertEquals(C.logical().name(), logicalContext().variable(C).name())
assertEquals(C.logical().pattern(), logicalContext().variable(C).pattern())
}
}
@ -241,7 +241,8 @@ class TestMatcher {
matcher(occurrence("foo", 42)).lookupMatches(occurrence("foo", 16)).let { matches ->
assertEquals(2, matches.count())
assertEquals(listOf("main1", "main1"), matches.map { m -> m.rule.tag() })
matches.map { m -> setOf(M, N).map { lp -> m.logicalContext().valueFor(lp) } }.forEach { vals ->
matches.map { m -> setOf(M, N).map { lp ->
m.logicalContext().variable(lp).findRoot().value() } }.forEach { vals ->
assertEquals(setOf(42, 16), vals.toSet())
}
assertTrue(matches.all{ m -> m.occurrences().toSet().size == 2 })