IO Operators
This commit is contained in:
parent
b9f419a59d
commit
82a8fccf87
22 changed files with 450 additions and 199 deletions
101
src/Main.kt
101
src/Main.kt
|
@ -1,98 +1,15 @@
|
|||
import better_parser.PrologParser
|
||||
import better_parser.SimpleReplParser
|
||||
import interpreter.SourceFileReader
|
||||
import prolog.Answer
|
||||
import interpreter.FileLoader
|
||||
import io.Logger
|
||||
import prolog.Program
|
||||
import prolog.ast.logic.Fact
|
||||
import prolog.ast.logic.Rule
|
||||
import prolog.ast.terms.Atom
|
||||
import prolog.ast.terms.CompoundTerm
|
||||
import prolog.ast.terms.Variable
|
||||
import prolog.builtins.Conjunction
|
||||
|
||||
fun help(): String {
|
||||
println("Unknown command. Type 'h' for help.")
|
||||
println("Commands:")
|
||||
println(" ; - find next solution")
|
||||
println(" a - abort")
|
||||
println(" . - end query")
|
||||
println(" h - help")
|
||||
println(" exit - exit Prolog REPL")
|
||||
return ""
|
||||
}
|
||||
|
||||
fun say(message: String) {
|
||||
println(message)
|
||||
}
|
||||
|
||||
fun prompt(message: String): String {
|
||||
print("$message ")
|
||||
var input: String = readlnOrNull() ?: help()
|
||||
while (input.isBlank()) {
|
||||
input = readlnOrNull() ?: help()
|
||||
}
|
||||
return input
|
||||
}
|
||||
|
||||
fun prettyResult(result: Answer): String {
|
||||
result.fold(
|
||||
onSuccess = {
|
||||
val subs = result.getOrNull()!!
|
||||
if (subs.isEmpty()) {
|
||||
return "true."
|
||||
}
|
||||
return subs.entries.joinToString(", ") { "${it.key} = ${it.value}" }
|
||||
},
|
||||
onFailure = {
|
||||
return "Failure: ${result.exceptionOrNull()!!}"
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
val knownCommands = setOf(";", "a", ".")
|
||||
import prolog.ast.logic.Clause
|
||||
import repl.Repl
|
||||
|
||||
fun main() {
|
||||
SourceFileReader().readFile("tests/better_parser/resources/parent.pl")
|
||||
// TODO Make this a command line argument
|
||||
// Turn on debug mode
|
||||
Logger.level = Logger.Level.DEBUG
|
||||
|
||||
val parser = SimpleReplParser(debug = false)
|
||||
|
||||
say("Prolog REPL. Type 'exit' to quit.")
|
||||
|
||||
while (true) {
|
||||
val queryString = prompt("?-")
|
||||
|
||||
try {
|
||||
val query = parser.parse(queryString)
|
||||
val answers = query.satisfy(emptyMap())
|
||||
|
||||
if (answers.none()) {
|
||||
say("false.")
|
||||
} else {
|
||||
val iterator = answers.iterator()
|
||||
|
||||
var previous = iterator.next()
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
var command = prompt(prettyResult(previous))
|
||||
|
||||
while (command !in knownCommands) {
|
||||
say("Unknown action: $command (h for help)")
|
||||
command = prompt("Action?")
|
||||
}
|
||||
|
||||
when (command) {
|
||||
";" -> previous = iterator.next()
|
||||
"a" -> break
|
||||
"." -> break
|
||||
}
|
||||
}
|
||||
|
||||
say(prettyResult(previous))
|
||||
}
|
||||
|
||||
} catch (e: Exception) {
|
||||
println("Error: ${e.message}")
|
||||
}
|
||||
}
|
||||
FileLoader().load("tests/parser/resources/parent.pl")
|
||||
|
||||
Repl().start()
|
||||
}
|
||||
|
|
Reference in a new issue