view ibin/brachylog/Brachylog-master/src/brachylog.pl @ 11865:318de151d0ec draft

<b_jonas> python3 -cimport os,zipfile; os.chdir("ibin/brachylog"); zipfile.ZipFile("master.zip").extractall()
author HackEso <hackeso@esolangs.org>
date Tue, 16 Jul 2019 21:37:27 +0000
parents
children
line wrap: on
line source

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
____            ____
\   \          /   /
 \   \  ____  /   /
  \   \/    \/   /
   \     /\     /     BRACHYLOG       
    \   /  \   /      A terse declarative logic programming language
    /   \  /   \    
   /     \/     \     Written by Julien Cumin - 2017
  /   /\____/\   \    https://github.com/JCumin/Brachylog
 /   /  ___   \   \
/___/  /__/    \___\
     
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */


:- use_module(transpile).
:- use_module(symbols).
:- use_module(utils).
:- use_module(predicates).
:- use_module(metapredicates).
:- use_module(constraint_variables).


/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   RUN_FROM_FILE
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
run_from_file(FilePath) :-
    run_from_file(FilePath, 'ignore', 'ignore').
run_from_file(FilePath, Input) :-
    run_from_file(FilePath, Input, 'ignore').
run_from_file(FilePath, Input, Output) :-
    read_file(FilePath, Code),
    !,
    run_from_atom(Code, Input, Output).
    
    
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   RUN_FROM_ATOM
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
run_from_atom(Code) :-
    run_from_atom(Code, 'ignore', 'ignore').
run_from_atom(Code, Input) :-
    run_from_atom(Code, Input, 'ignore').
run_from_atom(Code, Input, Output) :-
    parse(Code, 'compiled_brachylog.pl'),
    !,
    run(Input, Output).
    
    
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   RUN
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
run(Input, Output) :-
    set_prolog_flag(answer_write_options, [quoted(true),
                                           portray(true),
                                           max_depth(10),
                                           spacing(next_argument),
                                           max_depth(0)]),
    set_prolog_flag(print_write_options, [portray(true),
                                          quoted(true),
                                          numbervars(true),
                                          max_depth(0)]),
    consult('compiled_brachylog.pl'),
    (   \+ var(Input),
        Input \= 'ignore',
        parse_argument(Input, ParsedInput)
    ;   true
    ),
    (   \+ var(Output),
        Output \= 'ignore',
        parse_argument(Output, ParsedOutput)
    ;   true
    ),
    !,
    call(brachylog_main, _, _, ParsedInput, ParsedOutput),
    (   var(Input) ->
        brachylog_prolog_variable(ParsedInput, Input)
    ;   true
    ),
    (   var(Output) ->
        brachylog_prolog_variable(ParsedOutput, Output)
    ;   true
    ).
    
    
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   RUN_FROM_FILES_NO_FILE
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
run_from_files_no_file(FilePath, InputPath, OutputPath) :-
    read_file(FilePath, Atom),
    !,
    (   read_file(InputPath, Input),
        Input \= ''
    ;   Input = 'ignore'
    ),
    !,
    (   read_file(OutputPath, Output),
        Output \= ''
    ;   Output = 'ignore'
    ),
    !,
    parse_no_file(Atom, Predicates),
    !,
    (   contains_write(Atom) ->
        ContainsWrite = 'yes'
    ;   ContainsWrite = 'no'
    ),
    !,
    set_prolog_flag(answer_write_options, [quoted(true),
                                           portray(true),
                                           max_depth(10),
                                           spacing(next_argument),
                                           max_depth(0)]),
    set_prolog_flag(print_write_options, [portray(true),
                                          quoted(true),
                                          numbervars(true),
                                          max_depth(0)]),
    maplist(atomic_list_concat, Predicates, ConcatenatedPredicates),
    maplist(read_term_from_atom_, ConcatenatedPredicates, AssertablePredicates),
    maplist(assertz, AssertablePredicates),
    (   Input \= 'ignore',
        parse_argument(Input, ParsedInput),
        \+ var(ParsedInput),
        ReportInput = 'no'
    ;   Input == 'ignore',
        ReportInput = 'no'
    ;   ReportInput = 'yes',
        true
    ),
    (   Output \= 'ignore',
        parse_argument(Output, ParsedOutput),
        \+ var(ParsedOutput),
        ReportOutput = 'no'
    ;   Output == 'ignore',
        ReportOutput = 'no'
    ;   ReportOutput = 'yes',
        true
    ),
    !,
    (   call(brachylog_main, _, _, ParsedInput, ParsedOutput) ->
        (   ReportInput = 'yes' ->
            brachylog_prolog_variable(ParsedInput, InputProlog)
        ;   true
        ),
        (   ReportOutput = 'yes' ->
            brachylog_prolog_variable(ParsedOutput, OutputProlog)
        ;   true
        ),
        (   ReportInput = 'yes',
            Bindings = [Input=InputProlog]
        ;   Bindings = []
        ),
        (   ReportOutput = 'yes',
            BindingsFinal = [Output=OutputProlog|Bindings]
        ;   BindingsFinal = Bindings,
            true
        ),
        (   (ReportInput = 'yes' ; ReportOutput = 'yes'),
            write('\n')
        ;   true  
        ),
        reverse(BindingsFinal, RBindings),
        report_bindings(RBindings),
        (   ReportInput = 'no',
            ReportOutput = 'no',
            ContainsWrite = 'no',
            write('true.')
        ;   true
        )
    ;   (   ContainsWrite = 'no',
            write('false.')
        ;   true
        )
    ).

read_term_from_atom_(A, B) :-
    read_term_from_atom(A, B, []).

% Credits to M. Triska
% See: http://stackoverflow.com/a/38284692/2554145
report_bindings(NameVars) :-
    phrase(bindings(NameVars), Bs),
    format("~s", [Bs]).

bindings([])            --> [].
bindings([E])           --> name_var(E).
bindings([E1,E2|Rest]) --> name_var(E1), ",\n", bindings([E2|Rest]).

name_var(Name=Var) -->
    format_("~w = ~q", [Name,Var]).

format_(Format, Ls) -->
    call(format_codes(Format, Ls)).

format_codes(Format, Ls, Cs0, Cs) :-
    format(codes(Cs0, Cs), Format, Ls).


/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   READ_FILE
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
read_file(FilePath, Code) :-
    (   exists_file(FilePath),
        open(FilePath, read, File),
        read_file_(File, Chars),
        close(File),
        atomic_list_concat(Chars, Code)
    ;   throw('The file does not exist.')
    ),
    !.

read_file_(File, []) :-
    at_end_of_stream(File).
read_file_(File, [H|T]) :-
    \+ at_end_of_stream(File),
    get_char(File, H),
    read_file_(File, T).