2017-05-08 19:04:16 +01:00
|
|
|
%% @file yapi.yap
|
|
|
|
%% @brief support yap shell
|
|
|
|
%%
|
2017-05-19 09:56:37 +01:00
|
|
|
:- module(yapi, [query/3]).
|
2017-05-08 19:04:16 +01:00
|
|
|
|
2017-05-19 09:56:37 +01:00
|
|
|
:- use_module( library(lists) ).
|
2017-05-08 19:04:16 +01:00
|
|
|
:- use_module( library(maplist) ).
|
|
|
|
:- use_module( library(rbtrees) ).
|
|
|
|
|
|
|
|
|
2017-05-19 09:56:37 +01:00
|
|
|
%% @pred yap_query(0:Goal, + VarList, +OutStream, - Dictionary)
|
|
|
|
%% @pred yap_query(0:Goal, + VarList, - Dictionary)
|
|
|
|
%%
|
|
|
|
%% dictionary, Examples
|
|
|
|
%%
|
|
|
|
%%
|
|
|
|
yap_query( Goal, VarNames, Stream, Dictionary) :-
|
|
|
|
(
|
|
|
|
call(Goal)
|
|
|
|
*->
|
|
|
|
constraints(VarNames, Goal, Stream, Dictionary)
|
|
|
|
).
|
|
|
|
|
|
|
|
prolog:yap_query( Goal, VarNames, Dictionary) :-
|
|
|
|
yap_query( Goal, VarNames, user_output, Dictionary).
|
2017-05-08 19:04:16 +01:00
|
|
|
|
2017-05-19 09:56:37 +01:00
|
|
|
constraints(QVs, Goal, Stream, {Dict}) :-
|
|
|
|
!,
|
|
|
|
term_variables(Goal, IVs),
|
|
|
|
foldl(enumerate, IVs, 0, _Ns),
|
|
|
|
out(QVs, Stream, Dict).
|
|
|
|
constraints(_, _, {}) :-
|
|
|
|
format(' yes.~n', [] ).
|
|
|
|
|
|
|
|
bind_qv(V=V0, Vs, Vs) :- var(V0), !, V0='$VAR'(V).
|
|
|
|
bind_qv(V=V, Vs, Vs) :- !.
|
|
|
|
bind_qv(V=S, Vs, [V=S|Vs]).
|
|
|
|
|
|
|
|
enumerate('$VAR'(A), I, I1) :-
|
|
|
|
enum(I, Chars),
|
|
|
|
atom_codes(A,[0'_|Chars]),
|
|
|
|
I1 is I + 1.
|
|
|
|
|
|
|
|
enum(I, [C]) :-
|
|
|
|
I < 26,
|
|
|
|
!, C is "A" + I.
|
|
|
|
enum(I, [C|Cs]) :-
|
|
|
|
J is I//26,
|
|
|
|
K is I mod 26,
|
|
|
|
C is "A" +K,
|
|
|
|
enum(J, Cs).
|
|
|
|
|
|
|
|
out(Bs, S, _Dict) :-
|
|
|
|
output(Bs, S),
|
|
|
|
fail.
|
|
|
|
out(Bs, _S, Dict) :-
|
|
|
|
bvs(Bs, Dict).
|
|
|
|
|
|
|
|
v2py(v(I0) = _V, I0, I) :-
|
2017-05-08 19:04:16 +01:00
|
|
|
!,
|
2017-05-19 09:56:37 +01:00
|
|
|
I is I0+1.
|
|
|
|
v2py(v(I0) = v(I0), I0, I) :-
|
|
|
|
I is I0+1.
|
|
|
|
|
|
|
|
output([V=B], S) :-
|
|
|
|
format(S, 'a = ~q~n', [V, B]).
|
|
|
|
output([V=B|Ns], S) :-
|
|
|
|
format( S, 'a = ~q.~n', [V, B]),
|
|
|
|
output( Ns, S).
|
|
|
|
|
|
|
|
|
|
|
|
bvs([V=B],{V:B}) :-
|
|
|
|
!.
|
|
|
|
bvs([V=B|Ns], (V:B,N)) :-
|
|
|
|
output( Ns, N).
|
|
|
|
:- start_low_level_trace.
|