Checkpoint
This commit is contained in:
parent
ef8b82457c
commit
d702b9b081
13 changed files with 114 additions and 63 deletions
|
@ -1,15 +1,18 @@
|
|||
package prolog.builtins
|
||||
|
||||
import prolog.Substitution
|
||||
import prolog.components.expressions.Operand
|
||||
import prolog.components.expressions.Operator
|
||||
import prolog.components.terms.Atom
|
||||
import prolog.components.terms.Body
|
||||
import prolog.components.terms.Term
|
||||
import prolog.components.terms.Variable
|
||||
|
||||
/**
|
||||
* Always fail.
|
||||
*/
|
||||
class Fail: Atom("fail"), Body {
|
||||
override fun prove(): Boolean = false
|
||||
override fun prove(): Sequence<Substitution> = emptySequence()
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -21,7 +24,7 @@ typealias False = Fail
|
|||
* Always succeed.
|
||||
*/
|
||||
class True: Atom("true"), Body {
|
||||
override fun prove(): Boolean = true
|
||||
override fun prove(): Sequence<Substitution> = sequenceOf(emptyMap())
|
||||
}
|
||||
|
||||
// TODO Repeat/0
|
||||
|
@ -32,10 +35,16 @@ class True: Atom("true"), Body {
|
|||
* Conjunction (and). True if both Goal1 and Goal2 are true.
|
||||
*/
|
||||
class Conjunction(leftOperand: Operand, rightOperand: Operand) : Operator(Atom(","), leftOperand, rightOperand) {
|
||||
override fun prove(): Boolean {
|
||||
val left = leftOperand?.prove() ?: true
|
||||
val right = rightOperand.prove()
|
||||
return left && right
|
||||
override fun prove(): Sequence<Substitution> = sequence {
|
||||
if (leftOperand != null) {
|
||||
leftOperand.prove().forEach { left ->
|
||||
rightOperand.prove().forEach { right ->
|
||||
yield(left + right)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
yieldAll(rightOperand.prove())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -43,9 +52,10 @@ class Conjunction(leftOperand: Operand, rightOperand: Operand) : Operator(Atom("
|
|||
* Disjunction (or). True if either Goal1 or Goal2 succeeds.
|
||||
*/
|
||||
class Disjunction(leftOperand: Operand, rightOperand: Operand) : Operator(Atom(";"), leftOperand, rightOperand) {
|
||||
override fun prove(): Boolean {
|
||||
val left = leftOperand?.prove() ?: false
|
||||
val right = rightOperand.prove()
|
||||
return left || right
|
||||
override fun prove(): Sequence<Substitution> = sequence {
|
||||
if (leftOperand != null) {
|
||||
yieldAll(leftOperand.prove())
|
||||
}
|
||||
yieldAll(rightOperand.prove())
|
||||
}
|
||||
}
|
||||
|
|
Reference in a new issue