Updated API sources from the latest version of Logic. Adapted to the new API. Invocation/occurrence arguments.
This commit is contained in:
parent
bedb9592a0
commit
3cf3f4b21d
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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 })
|
||||
|
|
|
|||
Loading…
Reference in New Issue