-
Notifications
You must be signed in to change notification settings - Fork 2
/
prolog_shell.py
executable file
·99 lines (77 loc) · 2.29 KB
/
prolog_shell.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright 2015, 2016, 2017 Guenter Bartsch
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#
# interactive Zamia-Prolog shell
#
import os
import sys
import logging
import readline
import atexit
from optparse import OptionParser
from StringIO import StringIO
from nltools import misc
from zamiaprolog.logicdb import LogicDB
from zamiaprolog.parser import PrologParser, PrologError
from zamiaprolog.runtime import PrologRuntime, PrologRuntimeError
# logging.basicConfig(level=logging.DEBUG)
logging.basicConfig(level=logging.INFO)
#
# init
#
misc.init_app ('prolog_shell')
config = misc.load_config('.nlprc')
#
# readline, history
#
histfile = os.path.join(os.path.expanduser("~"), ".hal_prolog_history")
try:
readline.read_history_file(histfile)
# default history len is -1 (infinite), which may grow unruly
readline.set_history_length(1000)
except IOError:
pass
atexit.register(readline.write_history_file, histfile)
#
# main
#
db_url = config.get('db', 'url')
# db_url = 'sqlite:///tmp/foo.db'
db = LogicDB(db_url)
parser = PrologParser()
rt = PrologRuntime(db)
while True:
line = raw_input ('?- ')
if line == 'quit' or line == 'exit':
break
try:
c = parser.parse_line_clause_body(line)
logging.debug( "Parse result: %s" % c)
logging.debug( "Searching for c:", c )
solutions = rt.search(c)
if len(solutions)>0:
for s in solutions:
print repr(s)
print 'Yes.'
else:
print 'No.'
except PrologError as e:
print "*** ERROR: %s" % e
except PrologRuntimeError as e:
print "*** RUNTIME ERROR: %s" % e