Current scope: arg2p| all classes
|
it.unibo.tuprolog.argumentation.core.primitives.labelling.argument
Coverage Summary for Class: StronglyAdmissibleSet (it.unibo.tuprolog.argumentation.core.primitives.labelling.argument)
| Class | Class, % | Method, % | Branch, % | Line, % | Instruction, % |
|---|---|---|---|---|---|
| StronglyAdmissibleSet | 100% (1/1) | 100% (2/2) | 87.5% (7/8) | 100% (12/12) | 98% (100/102) |
package it.unibo.tuprolog.argumentation.core.primitives.labelling.argument
import it.unibo.tuprolog.argumentation.core.primitives.graph.attackGraph
import it.unibo.tuprolog.argumentation.core.primitives.graph.labelledIds
import it.unibo.tuprolog.core.Term
import it.unibo.tuprolog.solve.ExecutionContext
import it.unibo.tuprolog.solve.Signature
import it.unibo.tuprolog.solve.primitive.Primitive
import it.unibo.tuprolog.solve.primitive.Solve
/**
* stronglyAdmissibleSet: every IN argument is reachable from the unattacked ones, iteratively adding the IN
* arguments whose attackers are all attacked by those added so far
*/
internal object StronglyAdmissibleSet : Primitive {
val signature: Signature = Signature("stronglyAdmissibleSet", 0)
override fun solve(request: Solve.Request<ExecutionContext>): Sequence<Solve.Response> {
val attackers = request.attackGraph().attackers
val built = mutableSetOf<Term>()
var pending = request.labelledIds("in")
while (pending.isNotEmpty()) {
val added =
pending.filter { h ->
attackers[h].orEmpty().all { attacker -> attackers[attacker].orEmpty().any { it in built } }
}
if (added.isEmpty()) return sequenceOf(request.replyFail())
built += added
pending = pending - added.toSet()
}
return sequenceOf(request.replyWith(true))
}
}