Cleanup 3

This commit is contained in:
Tibo De Peuter 2025-05-09 19:49:37 +02:00
parent 3c938749d0
commit a5bd38ef01
Signed by: tdpeuter
GPG key ID: 38297DE43F75FFE2
6 changed files with 62 additions and 9 deletions

View file

@ -122,6 +122,11 @@ open class Add(private val expr1: Expression, private val expr2: Expression) :
)
}
class Plus(private val expr1: Expression, private val expr2: Expression, private val expr3: Expression) :
CompoundTerm("plus", expr1, expr2, expr3) {
override fun satisfy(subs: Substitutions): Answers = plus(expr1, expr2, expr3, subs)
}
/**
* Result = Expr1 - Expr2
*/

View file

@ -3,7 +3,6 @@ package prolog.builtins
import prolog.Answers
import prolog.Substitutions
import prolog.ast.arithmetic.Integer
import prolog.ast.terms.Atom
import prolog.ast.terms.Goal
import prolog.ast.terms.Structure
import prolog.ast.terms.Term

View file

@ -0,0 +1,39 @@
package prolog.builtins
import interpreter.FileLoader
import prolog.Answers
import prolog.Substitutions
import prolog.ast.logic.LogicOperand
import prolog.ast.logic.LogicOperator
import prolog.ast.terms.Atom
import prolog.ast.terms.Operator
import prolog.ast.terms.Term
import prolog.logic.applySubstitution
class Consult(val file: Term) : Operator("consult", rightOperand = file) {
private val fileLoader = FileLoader()
override fun satisfy(subs: Substitutions): Answers {
val fileAtom = applySubstitution(file, subs)
require(fileAtom is Atom) { "File name must be an atom" }
var filePath = fileAtom.name
if (!filePath.endsWith(".pl")) {
filePath += ".pl"
}
try {
fileLoader.load(filePath)
return sequenceOf(Result.success(emptyMap()))
} catch (e: Exception) {
return sequenceOf(Result.failure(e))
}
}
override fun toString(): String = "consult($file)"
}
class Initialization(val goal: LogicOperand) : LogicOperator(":-", rightOperand = goal) {
override fun satisfy(subs: Substitutions): Answers = goal.satisfy(subs).take(1)
override fun toString(): String = goal.toString()
}

View file

@ -2,7 +2,6 @@ package prolog.builtins
import prolog.Answers
import prolog.Substitutions
import prolog.ast.terms.Atom
import prolog.ast.terms.Goal
import prolog.ast.terms.Operator
import prolog.ast.terms.Term
@ -16,10 +15,18 @@ class Call(private val goal: Term) : Operator("call", rightOperand = goal) {
}
}
/**
* Make a possibly nondeterministic [Goal] semideterministic, i.e. succeed at most once.
*/
class Once(private val goal: Term) : Operator("once", rightOperand = goal) {
private val conjunction = Conjunction(Call(goal), Cut())
override fun satisfy(subs: Substitutions): Answers = conjunction.satisfy(subs).take(1)
}
/**
* Calls [Goal] once, but succeeds, regardless of whether Goal succeeded or not.
*/
class Ignore(goal: Goal) : Operator("ignore", rightOperand = goal) {
class Ignore(goal: Term) : Operator("ignore", rightOperand = goal) {
private val disjunction = Disjunction(
Conjunction(Call(goal), Cut()),
True

View file

@ -6,11 +6,6 @@ import prolog.ast.logic.LogicOperand
import prolog.ast.logic.LogicOperator
import prolog.ast.terms.Goal
class Initialization(val goal: LogicOperand) : LogicOperator(":-", rightOperand = goal) {
override fun satisfy(subs: Substitutions): Answers = goal.satisfy(subs).take(1)
override fun toString(): String = goal.toString()
}
class Query(val query: LogicOperand) : LogicOperator("?-", rightOperand = query) {
override fun satisfy(subs: Substitutions): Answers = query.satisfy(subs)
}