1:- module(race_ape, [
    2      check_consistency/3,
    3      ask_with_answers/3,
    4      prove_with_answers/3
    5   ]).    6:- reexport('../race', except([
    7      prove_with_answers/3,
    8      ask_with_answers/3
    9   ])).   10
   11% library(ape) loads the `tokenizer` module, too
   12:- use_module(library(ape)).   13
   14check_consistency(Knowledge, Result, Variant) :-
   15   replace_variables(Knowledge, Variant),
   16   race:check_consistency(Variant, Result),
   17   Result \= error(_),
   18   !.
   19
   20ask_with_answers(Knowledge, Question, Result) :-
   21   race:ask_with_answers(Knowledge, Question, Result).
   22
   23prove_with_answers(Knowledge, Theorem, Result) :-
   24   race:prove_with_answers(Knowledge, Theorem, Result).
   25
   26replace_variables(Text, Variant) :-
   27   tokenizer:tokenize(Text, Tokens),
   28   maplist(replace_possible_var, Tokens, TokenVariant),
   29   tokens_to_sentences:tokens_to_sentences(TokenVariant, SentencesTokenVariant),
   30   ace_niceace:tokens_to_sentences(SentencesTokenVariant, SentencesVariant),
   31   atomic_list_concat(SentencesVariant, ' ', Variant).
   32
   33replace_possible_var(Token, Variant) :-
   34   atom_codes(Token, Codes),
   35   Codes = [C],  % one char only
   36   C >= 97,
   37   C =< 122,
   38   !,
   39   variant(C, Cn),
   40   atom_codes(Variant, [Cn]).
   41
   42replace_possible_var(Token, Token).
   43
   44% for "a" start with lowercase first
   45variant(97, Cn) :-
   46   !,
   47   ( Cn = 97 ; Cn = 65 ).
   48% for all other lowercase letters start with its capitalized version first
   49%   since it is a variable in most cases.
   50variant(C, Cn) :-
   51   ( Cn is C - 32
   52   ; Cn is C )