From 438af6c053336b6a2c81a55589fd9b352806c842 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Sat, 5 Apr 2025 18:07:31 +0200 Subject: [PATCH] Single clause queries --- src/prolog/components/Functor.kt | 9 --------- src/prolog/components/Program.kt | 2 ++ src/prolog/components/expressions/Clause.kt | 4 ++-- src/prolog/components/expressions/Expression.kt | 2 +- src/prolog/components/expressions/Predicate.kt | 4 ++-- src/prolog/components/terms/Atom.kt | 7 ++----- src/prolog/components/{ => terms}/Goal.kt | 8 +++----- src/prolog/components/terms/Head.kt | 4 ++-- src/prolog/components/terms/Structure.kt | 7 ++----- src/prolog/unify.kt | 1 - 10 files changed, 16 insertions(+), 32 deletions(-) delete mode 100644 src/prolog/components/Functor.kt rename src/prolog/components/{ => terms}/Goal.kt (78%) diff --git a/src/prolog/components/Functor.kt b/src/prolog/components/Functor.kt deleted file mode 100644 index bba168e..0000000 --- a/src/prolog/components/Functor.kt +++ /dev/null @@ -1,9 +0,0 @@ -package prolog.components - -import prolog.components.terms.Atom - -data class Functor(val name: Atom, val arity: Int) { - override fun toString(): String { - return "${name.name}/${arity}" - } -} diff --git a/src/prolog/components/Program.kt b/src/prolog/components/Program.kt index 9339436..101cc6c 100644 --- a/src/prolog/components/Program.kt +++ b/src/prolog/components/Program.kt @@ -4,6 +4,8 @@ import prolog.builtins.True import prolog.components.expressions.Clause import prolog.components.expressions.Fact import prolog.components.expressions.Predicate +import prolog.components.terms.Functor +import prolog.components.terms.Goal /** * Prolog Program or database. diff --git a/src/prolog/components/expressions/Clause.kt b/src/prolog/components/expressions/Clause.kt index 3362a78..aa2ba3f 100644 --- a/src/prolog/components/expressions/Clause.kt +++ b/src/prolog/components/expressions/Clause.kt @@ -1,7 +1,7 @@ package prolog.components.expressions -import prolog.components.Functor -import prolog.components.Goal +import prolog.components.terms.Functor +import prolog.components.terms.Goal import prolog.components.terms.Head import prolog.components.terms.Term import prolog.unify diff --git a/src/prolog/components/expressions/Expression.kt b/src/prolog/components/expressions/Expression.kt index 34a4ec5..f032c70 100644 --- a/src/prolog/components/expressions/Expression.kt +++ b/src/prolog/components/expressions/Expression.kt @@ -1,6 +1,6 @@ package prolog.components.expressions -import prolog.components.Goal +import prolog.components.terms.Goal interface Expression { fun evaluate(goal: Goal): Boolean diff --git a/src/prolog/components/expressions/Predicate.kt b/src/prolog/components/expressions/Predicate.kt index b3866a4..e0a80ca 100644 --- a/src/prolog/components/expressions/Predicate.kt +++ b/src/prolog/components/expressions/Predicate.kt @@ -1,7 +1,7 @@ package prolog.components.expressions -import prolog.components.Functor -import prolog.components.Goal +import prolog.components.terms.Functor +import prolog.components.terms.Goal /** * Collection of [Clause]s with the same [Functor]. diff --git a/src/prolog/components/terms/Atom.kt b/src/prolog/components/terms/Atom.kt index 7a08912..e7bada8 100644 --- a/src/prolog/components/terms/Atom.kt +++ b/src/prolog/components/terms/Atom.kt @@ -1,10 +1,7 @@ package prolog.components.terms -import prolog.components.Functor -import prolog.components.Goal - -open class Atom(val name: String): Head(), Term, Goal { - override val functor: Functor = Functor(this, 0) +open class Atom(val name: String): Goal() { + override val functor: Functor = "$name/_" override fun toString(): String { return name diff --git a/src/prolog/components/Goal.kt b/src/prolog/components/terms/Goal.kt similarity index 78% rename from src/prolog/components/Goal.kt rename to src/prolog/components/terms/Goal.kt index a7bfb66..fde932f 100644 --- a/src/prolog/components/Goal.kt +++ b/src/prolog/components/terms/Goal.kt @@ -1,6 +1,6 @@ -package prolog.components +package prolog.components.terms -import prolog.components.terms.Term +import prolog.components.Program /** * Question stated to the Prolog engine. @@ -9,9 +9,7 @@ import prolog.components.terms.Term * A goal either [succeeds][prolog.builtins.True], in which case the variables in the compound terms have a binding, * or it fails if Prolog fails to prove it. */ -interface Goal: Term { - val functor: Functor - +abstract class Goal : Head() { fun prove(): Boolean { return Program.query(this) } diff --git a/src/prolog/components/terms/Head.kt b/src/prolog/components/terms/Head.kt index 62b26e8..1a33247 100644 --- a/src/prolog/components/terms/Head.kt +++ b/src/prolog/components/terms/Head.kt @@ -1,7 +1,5 @@ package prolog.components.terms -import prolog.components.Functor - /** * Part of a [Clause][prolog.components.expressions.Clause] before the [neck][prolog.terms.Neck] operator. * @@ -11,3 +9,5 @@ import prolog.components.Functor abstract class Head: Term { abstract val functor: Functor } + +typealias Functor = String diff --git a/src/prolog/components/terms/Structure.kt b/src/prolog/components/terms/Structure.kt index 0e11a39..e3d4aba 100644 --- a/src/prolog/components/terms/Structure.kt +++ b/src/prolog/components/terms/Structure.kt @@ -1,10 +1,7 @@ package prolog.components.terms -import prolog.components.Functor -import prolog.components.Goal - -open class Structure(val name: Atom, val arguments: List): Head(), Term, Goal { - override val functor: Functor = Functor(name, arguments.size) +open class Structure(val name: Atom, val arguments: List): Goal() { + override val functor: Functor = "${name.name}/${arguments.size}" override fun toString(): String { return when { diff --git a/src/prolog/unify.kt b/src/prolog/unify.kt index 0ad2c5d..1cc38c3 100644 --- a/src/prolog/unify.kt +++ b/src/prolog/unify.kt @@ -3,7 +3,6 @@ package prolog import prolog.builtins.atomic import prolog.builtins.compound import prolog.builtins.variable -import prolog.components.Goal import prolog.components.terms.Term import prolog.components.terms.Variable import prolog.components.terms.Structure