class PrologQueryHook

Public Instance Methods

command_line(filename) click to toggle source
# File lib/query_hook.rb, line 4
def command_line(filename)
  "swipl -f #{filename} --quiet -t main 2>&1"
end
compile_file_content(req) click to toggle source
# 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