User interface

Run Prolog from the code directory.

Load the file run.pro. That executes some directives, and loads the remaining Prolog files.

Parsing and running programs

The following predicates allow programs in the specified language to be parsed and run.

run(T) starts a computation with initial state T and initial label specified by init_label. If the computation terminates, it prints the final state.

run(T) :-
        init_label(X),
        T ---X--->* F, nl, nl,
        write('--- '), print(X), write(' --->*'),
        nl, print_nl_tree(F).

run(T, N) starts a computation with initial state T and initial label specified by init_label. If the computation terminates in N or fewer steps, it prints the final state, otherwise it prints the state after the Nth step.

run(T, N) :-
        init_label(X),
        T ---X---N>* SN, nl, nl,
        write('--- '), print(X), write(' --- '),
        print(N), write(' >*'), nl, print_nl_tree(SN).

..._run both parses and runs programs. no_pretty turns off the printing of the initial state.

parse_run(S, N) :-
        parse_prog(S, T), !,
        run(T, N).

parse_run(S) :-
        parse_prog(S, T), !,
        run(T).

parsef_run(F, N) :-
        parsef_prog(F, T), !,
        run(T, N).

parsef_run(F) :-
        parsef_prog(F, T), !,
        run(T).

parse(S, T) parses string S as T, then optionally pretty-prints T.

parse(S, T) :-
        phrase(T, S), !,
        opt_pretty(T).

parse_prog(S, T) parses string S as prog(T), then optionally pretty-prints T.

parse_prog(S, T) :-
        phrase(prog(T), S), !,
        opt_pretty(T).

parse_prog(S) :-
        phrase(prog(T), S), !,
        opt_pretty(T).

parsef forms the string from a file.

parsef(F, T) :-
        see(F), read_chars(S), seen, !,
        parse(S, T).

parsef_prog(F, T) :-
        see(F), read_chars(S), seen, !,
        parse_prog(S, T).

parsef_prog(F) :-
        see(F), read_chars(S), seen, !,
        parse_prog(S).

read_chars(Cs) sets Cs to the list of characters read from the current input stream

read_chars(Cs) :-
	get_char(C), nl, show(C), read_rest(C, Cs), nl.

read_rest(end_of_file, []) :- !.
read_rest(C, [C|Cs]) :- get_char(C1), show(C1), read_rest(C1, Cs).

show(end_of_file) :- !.
show(C) :- write(C).

Pretty printing programs

:- set_prolog_flag(pretty, true).
pretty    :- set_prolog_flag(pretty, true).
no_pretty :- set_prolog_flag(pretty, false).

:- set_prolog_flag(blank, true).
blank :- set_prolog_flag(blank, true).
lined :- set_prolog_flag(blank, false).

opt_pretty(T) :-
        (   current_prolog_flag(pretty, true)
        ->  print_nl_tree(T), !
        ;   true
        ).

print_nl_tree(T) :- print_nl_tree(T, 0).

print_nl_tree(T, N) :-
        indent(N), print_tree(T, N).

print_tree(T, N) assumes already at column 2N, prints T in columns >= 2N, ending at column >= 2N.

print_tree(T) :-
        print_tree(T, 0).

print_tree(T, N) :-
        (   atomic(T)
        ->  write(T)
        ;   T = []
        ->  write('[ ]')
        ;   is_list(T)
        ->  write('[ '), N1 is N+1,
            print_list(T, N1),
            write(' ]')
        ;   T =.. [F, T1], atomic(T1)
        ->  write(F), write('('), write(T1), write(')')
        ;   T = (T1=T2), atomic(T1), atomic(T2)
        ->  write(T1), write(' = '), write(T2)
        ;   T = (T1=T2), atomic(T1)
        ->  write(T1), write(' = '), N1 is N+1,
            print_nl_tree(T2, N1)
        ;   T =.. [F|L]
        ->  write(F), indent(N),
            write('( '), N1 is N+1,
            print_list(L, N1), write(' )')
        ).

print_list(L, N) assumes already at column 2N, prints elements of L on separate lines starting at column 2N, terminating each line except the last with a comma.

print_list([], _N).

print_list([H], N) :-
        print_tree(H, N).

print_list([H|L], N) :-
        print_tree(H, N), write(','), indent(N),
        print_list(L, N).

indent(N) :-
        (   N =< 0 -> nl, tab(4)
        ;   N1 is N-1, indent(N1), indent
        ).

indent may be redefined, e.g. to write('    ')

indent :-
        (   current_prolog_flag(blank, true) -> write('  ')
        ;   write('| ')
        ).