Class: PrologQueryHook

Inherits:
Mumukit::Templates::FileHook
  • Object
show all
Defined in:
lib/query_hook.rb

Instance Method Summary collapse

Instance Method Details

#command_line(filename) ⇒ Object



4
5
6
# File 'lib/query_hook.rb', line 4

def command_line(filename)
  "swipl -f #{filename} --quiet -t main 2>&1"
end

#compile_file_content(req) ⇒ Object



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
# File 'lib/query_hook.rb', line 8

def compile_file_content(req)
  <<PROLOG
#{req.extra}
#{req.content}

main(_):-
run_query('#{req.query.gsub('\\', '\\' * 3 )}').

run_query(Query):-
  catch(findall(Result, (atom_to_term(Query, Term, Result), Term), ResultSet),
    error(TypeError,_),
    (handleQueryError(TypeError, Query), halt(100)) ),
  prettyWriteResultSet(ResultSet).

handleQueryError(type_error(callable,_), Query):-
writef('ERROR: run_query/1: Expected Callable predicate but instead got %w\\n', [Query]).

handleQueryError(syntax_error(TypeSyntaxError), Query):-
writef('ERROR: run_query/1: Syntax Error: %w in %w\\n', [TypeSyntaxError, Query]).

handleQueryError(signal(_,Number), _):-
SignalStatus is 128 + Number,
halt(SignalStatus).

handleQueryError(GeneralError, Query):-
writef('ERROR: run_query/1: %w in \\'%w\\'\\n', [GeneralError, Query]).

prettyWriteResultSet([]):-
writeln('no.').

prettyWriteResultSet([OneResult]):-
prettyWriteOneResult(OneResult),
writeln('.').

prettyWriteResultSet([OneResult | ResultSet]):-
ResultSet \\= [],
prettyWriteOneResult(OneResult),
writeln(' ;'),
prettyWriteResultSet(ResultSet).

prettyWriteOneResult([]):-
     write('yes').

prettyWriteOneResult([OneBinding]):-
     writeBinding(OneBinding).

prettyWriteOneResult([OneBinding | OneResult]):-
     OneResult \\= [],
     writeBinding(OneBinding),
     writeln(','),
     prettyWriteOneResult(OneResult).

writeBinding(OneBinding):-
     OneBinding=..[(=), VarName, Value],
     writef('%w = %w', [VarName, Value]).

writeBinding(NotABinding):-
     not(NotABinding=..[(=) | _ ]),
     writef('ERROR: writeBinding/1: Expected Binding, but no equals was found in: %w\\n', [NotABinding]),
     halt(101).

PROLOG
end