debugging
This commit is contained in:
parent
b59af58616
commit
2415a2e58c
@ -1741,7 +1741,7 @@ X_API bool YAP_EnterGoal(YAP_PredEntryPtr ape, CELL *ptr, YAP_dogoalinfo *dgi) {
|
|||||||
//fprintf(stderr,"PrepGoal: H=%d ENV=%p B=%d TR=%d P=%p CP=%p Slots=%d\n",
|
//fprintf(stderr,"PrepGoal: H=%d ENV=%p B=%d TR=%d P=%p CP=%p Slots=%d\n",
|
||||||
// HR-H0,LCL0-ENV,LCL0-(CELL*)B,(CELL*)TR-LCL0, P, CP, LOCAL_CurSlot);
|
// HR-H0,LCL0-ENV,LCL0-(CELL*)B,(CELL*)TR-LCL0, P, CP, LOCAL_CurSlot);
|
||||||
out = Yap_exec_absmi(true, false);
|
out = Yap_exec_absmi(true, false);
|
||||||
// fprintf(stderr,"LeaveGoal success=%d: H=%d ENV=%p B=%d TR=%d P=%p CP=%p Slots=%d\n", out,HR-H0,LCL0-ENV,LCL0-(CELL*)B,(CELL*)TR-LCL0, P, CP, LOCAL_CurSlot);
|
fprintf(stderr,"LeaveGoal success=%d: H=%d ENV=%p B=%d TR=%d P=%p CP=%p Slots=%d\n", out,HR-H0,LCL0-ENV,LCL0-(CELL*)B,(CELL*)TR-LCL0, P, CP, LOCAL_CurSlot);
|
||||||
if (out) {
|
if (out) {
|
||||||
dgi->EndSlot = LOCAL_CurSlot;
|
dgi->EndSlot = LOCAL_CurSlot;
|
||||||
Yap_StartSlots();
|
Yap_StartSlots();
|
||||||
@ -1792,8 +1792,8 @@ X_API bool YAP_LeaveGoal(bool successful, YAP_dogoalinfo *dgi) {
|
|||||||
CACHE_REGS
|
CACHE_REGS
|
||||||
choiceptr myB;
|
choiceptr myB;
|
||||||
|
|
||||||
// fprintf(stderr,"LeaveGoal success=%d: H=%d ENV=%p B=%d TR=%d P=%p CP=%p Slots=%d\n",
|
fprintf(stderr,"LeaveGoal success=%d: H=%d ENV=%p B=%d TR=%d P=%p CP=%p Slots=%d\n",
|
||||||
// successful,HR-H0,LCL0-ENV,LCL0-(CELL*)B,(CELL*)TR-LCL0, P, CP, LOCAL_CurSlot);
|
successful,HR-H0,LCL0-ENV,LCL0-(CELL*)B,(CELL*)TR-LCL0, P, CP, LOCAL_CurSlot);
|
||||||
BACKUP_MACHINE_REGS();
|
BACKUP_MACHINE_REGS();
|
||||||
myB = (choiceptr)(LCL0 - dgi->b0);
|
myB = (choiceptr)(LCL0 - dgi->b0);
|
||||||
if (B < myB) {
|
if (B < myB) {
|
||||||
@ -1827,9 +1827,6 @@ X_API bool YAP_LeaveGoal(bool successful, YAP_dogoalinfo *dgi) {
|
|||||||
DEPTH = ENV[E_DEPTH];
|
DEPTH = ENV[E_DEPTH];
|
||||||
#endif
|
#endif
|
||||||
/* make sure we prune C-choicepoints */
|
/* make sure we prune C-choicepoints */
|
||||||
if (POP_CHOICE_POINT(B->cp_b)) {
|
|
||||||
POP_EXECUTE();
|
|
||||||
}
|
|
||||||
ENV = (CELL *)(ENV[E_E]);
|
ENV = (CELL *)(ENV[E_E]);
|
||||||
/* ASP should be set to the top of the local stack when we
|
/* ASP should be set to the top of the local stack when we
|
||||||
did the call */
|
did the call */
|
||||||
@ -1843,8 +1840,8 @@ X_API bool YAP_LeaveGoal(bool successful, YAP_dogoalinfo *dgi) {
|
|||||||
P = dgi->p;
|
P = dgi->p;
|
||||||
LOCAL_CurSlot = dgi->CurSlot;
|
LOCAL_CurSlot = dgi->CurSlot;
|
||||||
RECOVER_MACHINE_REGS();
|
RECOVER_MACHINE_REGS();
|
||||||
// fprintf(stderr,"LeftGoal success=%d: H=%d ENV=%p B=%d TR=%d P=%p CP=%p Slots=%d\n",
|
fprintf(stderr,"LeftGoal success=%d: H=%d ENV=%p B=%d TR=%d P=%p CP=%p Slots=%d\n",
|
||||||
// successful,HR-H0,LCL0-ENV,LCL0-(CELL*)B,(CELL*)TR-LCL0, P, CP, LOCAL_CurSlot);
|
successful,HR-H0,LCL0-ENV,LCL0-(CELL*)B,(CELL*)TR-LCL0, P, CP, LOCAL_CurSlot);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,6 +517,8 @@ bool YAPEngine::mgoal(Term t, Term tmod, bool release) {
|
|||||||
#if YAP_PYTHON
|
#if YAP_PYTHON
|
||||||
// PyThreadState *_save;
|
// PyThreadState *_save;
|
||||||
|
|
||||||
|
|
||||||
|
std::cerr << "mgoal " << YAPTerm(t).text() << "\n";
|
||||||
// _save = PyEval_SaveThread();
|
// _save = PyEval_SaveThread();
|
||||||
#endif
|
#endif
|
||||||
CACHE_REGS
|
CACHE_REGS
|
||||||
@ -715,6 +717,8 @@ RECOVER_MACHINE_REGS();
|
|||||||
bool YAPQuery::next() {
|
bool YAPQuery::next() {
|
||||||
CACHE_REGS
|
CACHE_REGS
|
||||||
bool result = false;
|
bool result = false;
|
||||||
|
std::cerr << "next " << goal.text() << "\n";
|
||||||
|
|
||||||
sigjmp_buf buf, *oldp = LOCAL_RestartEnv;
|
sigjmp_buf buf, *oldp = LOCAL_RestartEnv;
|
||||||
e = nullptr;
|
e = nullptr;
|
||||||
BACKUP_MACHINE_REGS();
|
BACKUP_MACHINE_REGS();
|
||||||
|
@ -11,6 +11,7 @@ set (LIBRARY_PL
|
|||||||
charsio.yap
|
charsio.yap
|
||||||
clauses.yap
|
clauses.yap
|
||||||
coinduction.yap
|
coinduction.yap
|
||||||
|
completer.yap
|
||||||
dbqueues.yap
|
dbqueues.yap
|
||||||
dbusage.yap
|
dbusage.yap
|
||||||
dgraphs.yap
|
dgraphs.yap
|
||||||
|
123
library/completer.yap
Normal file
123
library/completer.yap
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
/**
|
||||||
|
x @file complete.yap
|
||||||
|
*
|
||||||
|
* @brief Prolog completer.
|
||||||
|
*/
|
||||||
|
|
||||||
|
:- module( completer,
|
||||||
|
[
|
||||||
|
completions/2
|
||||||
|
]).
|
||||||
|
|
||||||
|
:- use_module(library(lists)).
|
||||||
|
:- use_module(library(maplist)).
|
||||||
|
:- use_module(library(python)).
|
||||||
|
|
||||||
|
%% completions( +Text, +PythonCell )
|
||||||
|
%
|
||||||
|
% Tries to complete the current text. The list with the set of completions
|
||||||
|
% is stored in the
|
||||||
|
% `matches` field of the python object.
|
||||||
|
%
|
||||||
|
completions(S, Self) :-
|
||||||
|
open_mem_read_stream(S, St),
|
||||||
|
scan_to_list(St, Tokens),
|
||||||
|
close(St),
|
||||||
|
reverse(Tokens, RTokens),
|
||||||
|
strip_final_tokens(RTokens, MyTokens),
|
||||||
|
setof( Completion, complete(MyTokens, Completion), Cs),
|
||||||
|
Self.matches := Cs.
|
||||||
|
|
||||||
|
|
||||||
|
strip_final_tokens(['EOT'|Ts], Ts) :- !.
|
||||||
|
strip_final_tokens( Ts, Ts ).
|
||||||
|
|
||||||
|
complete([E,l,C,l,A|More],
|
||||||
|
isconsult(A),
|
||||||
|
%B = l,
|
||||||
|
library(C,Lib),
|
||||||
|
%D=l,
|
||||||
|
E=atom(Prefix),
|
||||||
|
\+ arg( Rest ),
|
||||||
|
check_library( Prefix, Lib, C).
|
||||||
|
complete([E,l,C,l,-,'['|More],
|
||||||
|
isconsult(A),
|
||||||
|
%B = l,
|
||||||
|
library(C,Lib),
|
||||||
|
%D=l,
|
||||||
|
E=atom(Prefix),
|
||||||
|
\+ arg( Rest ),
|
||||||
|
check_library( Prefix, Lib, C).
|
||||||
|
complete([C,l,A|More],
|
||||||
|
isconsult(A),
|
||||||
|
%B = l,
|
||||||
|
C=atom(Prefix),
|
||||||
|
\+ arg( Rest ),
|
||||||
|
file_or_library( Prefix, C).
|
||||||
|
complete([C,l,-,'['|More],
|
||||||
|
isconsult(A),
|
||||||
|
%B = l,
|
||||||
|
C=atom(Prefix),
|
||||||
|
\+ arg( Rest ),
|
||||||
|
file_or_library( Prefix, C).
|
||||||
|
complete( [atom(F)|Rest], C) :-
|
||||||
|
\+ arg( Rest ),
|
||||||
|
predicate( F, Pred, Arity ),
|
||||||
|
cont( Arity, F, Pred, C).
|
||||||
|
|
||||||
|
isconsult( atom(use_module) ).
|
||||||
|
isconsult( atom(ensure_loaded) ).
|
||||||
|
isconsult( atom(compile) ).
|
||||||
|
isconsult( atom(consult) ).
|
||||||
|
isconsult( atom(reconsult) ).
|
||||||
|
isconsult( atom(load_files) ).
|
||||||
|
isconsult( '[' ).
|
||||||
|
|
||||||
|
arg([']'|_]).
|
||||||
|
arg([l|_]).
|
||||||
|
|
||||||
|
file_or_library(F,C) :-
|
||||||
|
libsym(C0),
|
||||||
|
atom_cooncat(F,C,C0).
|
||||||
|
file_or_library(F,C) :-
|
||||||
|
check_file(F,C).
|
||||||
|
|
||||||
|
check_file(F0,C) :-
|
||||||
|
atom_concat('\'',F,F0),
|
||||||
|
!,
|
||||||
|
absolute_file_name( F, FF, [access(none)] ),
|
||||||
|
atom_concat( FF, '*' , Pat),
|
||||||
|
absolute_file_name( Pat, C0, [glob(true)] ),
|
||||||
|
atom_concat(Pat,C00,C0),
|
||||||
|
atom_conct(C00,'\'',C).
|
||||||
|
check_file(F0,C) :-
|
||||||
|
atom_concat( F0, '*' , Pat),
|
||||||
|
absolute_file_name( Pat, C0, [glob(true)] ),
|
||||||
|
atom_concat(Pat,C,C0).
|
||||||
|
|
||||||
|
check_library( Lib, F, C) :-
|
||||||
|
atom_concat( F, '*' , Pat),
|
||||||
|
LibF =.. [Lib(Pat)],
|
||||||
|
absolute_file_name( LibF, Lib, [glob(true)] ),
|
||||||
|
file_directory_name( Lib, Name),
|
||||||
|
( atom_concat(C, '.yap', Name) -> true ;
|
||||||
|
atom_concat(C, '.ypp', Name) -> true ;
|
||||||
|
atom_concat(C, '.prolog', Name) -> true
|
||||||
|
).
|
||||||
|
|
||||||
|
predicate(N,P,A) :-
|
||||||
|
system_predicate(P0/A),
|
||||||
|
atom_concat(N,P,P0).
|
||||||
|
predicate(N,P,A) :-
|
||||||
|
current_predicate(P0/A),
|
||||||
|
atom_concat(N,P,P0).
|
||||||
|
|
||||||
|
cont(0, F, P, P0) :-
|
||||||
|
atom_concat( F, P, P0 ).
|
||||||
|
cont( _, F, P, PB ):-
|
||||||
|
atom_concat( [F, P, '( )'], PB ).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -30,9 +30,9 @@
|
|||||||
python/2,
|
python/2,
|
||||||
acquire_GIL/0,
|
acquire_GIL/0,
|
||||||
release_GIL/0,
|
release_GIL/0,
|
||||||
python_threaded/0,
|
python_threaded/0,
|
||||||
prolog_list_to_python_list/3,
|
prolog_list_to_python_list/3,
|
||||||
op(100,fy,$),
|
op(100,fy,$),
|
||||||
op(950,fy,:=),
|
op(950,fy,:=),
|
||||||
op(950,yfx,:=),
|
op(950,yfx,:=),
|
||||||
% op(950,fx,<-),
|
% op(950,fx,<-),
|
||||||
|
@ -10,17 +10,19 @@
|
|||||||
yap_query/4,
|
yap_query/4,
|
||||||
python_query/2,
|
python_query/2,
|
||||||
python_query/3,
|
python_query/3,
|
||||||
|
python_import/1,
|
||||||
yapi_query/2
|
yapi_query/2
|
||||||
]).
|
]).
|
||||||
|
|
||||||
:- yap_flag(verbose, silent).
|
:- yap_flag(verbose, silent).
|
||||||
|
|
||||||
|
:- use_module(library(python)).
|
||||||
|
|
||||||
:- use_module( library(lists) ).
|
:- use_module( library(lists) ).
|
||||||
:- use_module( library(maplist) ).
|
:- use_module( library(maplist) ).
|
||||||
:- use_module( library(rbtrees) ).
|
:- use_module( library(rbtrees) ).
|
||||||
:- use_module( library(terms) ).
|
:- use_module( library(terms) ).
|
||||||
:- reexport( library(python) ).
|
|
||||||
|
|
||||||
:- python_import(yap4py.yapi).
|
:- python_import(yap4py.yapi).
|
||||||
%:- python_import(gc).
|
%:- python_import(gc).
|
||||||
|
@ -280,7 +280,8 @@ set (RENAMED_RESOURCES
|
|||||||
# yap_kernel/resources/codemirror/mode/prolog/prolog.js
|
# yap_kernel/resources/codemirror/mode/prolog/prolog.js
|
||||||
)
|
)
|
||||||
|
|
||||||
set (PL_SOURCES yap_ipython/prolog/jupyter.yap)
|
set (PL_SOURCES yap_ipython/prolog/jupyter.yap
|
||||||
|
)
|
||||||
|
|
||||||
set(FILES ${PYTHON_SOURCES} ${PL_SOURCES} ${EXTRAS} ${RESOURCES})
|
set(FILES ${PYTHON_SOURCES} ${PL_SOURCES} ${EXTRAS} ${RESOURCES})
|
||||||
|
|
||||||
|
@ -1,30 +1,24 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @file jupyter.yap
|
* @file jupyter.yap4py
|
||||||
*
|
*
|
||||||
* @brief allow interaction between Jupyter and YAP.
|
* @brief JUpyter support.
|
||||||
*
|
*/
|
||||||
* @long The code in here:
|
|
||||||
* - establishes communication between Prolog and Python Streams
|
|
||||||
* - inputs Prolog code and queries
|
|
||||||
* - supports completion of Prolog programs.
|
|
||||||
* -
|
|
||||||
*/
|
|
||||||
|
|
||||||
% :- module( jupyter,
|
% :- module( jupyter,
|
||||||
% [jupyter_query/3,
|
% [jupyter_query/3,
|
||||||
% errors/2,
|
% errors/2,
|
||||||
% ready/2,
|
% ready/2,
|
||||||
% completion/2,
|
% completion/2,
|
||||||
|
|
||||||
% ]
|
% ]
|
||||||
%% ).
|
%% ).
|
||||||
:- [library(hacks)].
|
:- use_module(library(hacks)).
|
||||||
:- reexport(library(yapi)).
|
|
||||||
:- reexport(completer).
|
|
||||||
:- use_module(library(lists)).
|
:- use_module(library(lists)).
|
||||||
:- use_module(library(maplist)).
|
:- use_module(library(maplist)).
|
||||||
|
|
||||||
:- use_module(library(python)).
|
:- use_module(library(python)).
|
||||||
|
:- use_module(library(yapi)).
|
||||||
|
|
||||||
:- python_import(sys).
|
:- python_import(sys).
|
||||||
|
|
||||||
@ -40,7 +34,8 @@ jupyter_cell( _Caller, _, Line ) :-
|
|||||||
jupyter_cell( _Caller, _, [] ) :- !.
|
jupyter_cell( _Caller, _, [] ) :- !.
|
||||||
jupyter_cell( Caller, _, Line ) :-
|
jupyter_cell( Caller, _, Line ) :-
|
||||||
Self := Caller.query,
|
Self := Caller.query,
|
||||||
python_query( Self, Line, box_input ).
|
start_low_level_trace,
|
||||||
|
python_query( Self, Line ).
|
||||||
|
|
||||||
jupyter_consult(Text) :-
|
jupyter_consult(Text) :-
|
||||||
blank( Text ),
|
blank( Text ),
|
||||||
@ -62,21 +57,26 @@ blankc('\t').
|
|||||||
|
|
||||||
|
|
||||||
streams(false) :-
|
streams(false) :-
|
||||||
nb_setval(jupyter_cell, false),
|
nb_setval(jupyter_cell, false),
|
||||||
flush_output,
|
fail,
|
||||||
forall(
|
flush_output,
|
||||||
stream_property( S, mode(_) ),
|
retract(cell_stream(S)),
|
||||||
close(S)
|
close(S),
|
||||||
).
|
fail.
|
||||||
|
streams(false).
|
||||||
streams(true) :-
|
streams(true) :-
|
||||||
nb_setval(jupyter_cell, true),
|
|
||||||
% open('/python/input', read, _Input, [alias(user_input),bom(false)]),
|
|
||||||
open('/python/sys.stdout', append, _Output, [alias(user_output)]),
|
|
||||||
open('/python/sys.stderr', append, _Error, [alias(user_error)]),
|
|
||||||
% set_prolog_flag(user_input,_Input),
|
|
||||||
set_prolog_flag(user_output,_Output),
|
|
||||||
set_prolog_flag(user_error,_Error).
|
|
||||||
|
|
||||||
|
nb_setval(jupyter_cell, true),
|
||||||
|
fail,
|
||||||
|
% open('/python/input', read, _Input, [alias(user_input),bom(false)]),
|
||||||
|
open('/python/sys.stdout', append, Output, [alias(user_output)]),
|
||||||
|
assert( cell_stream( Output) ),
|
||||||
|
open('/python/sys.stderr', append, Error, [alias(user_error)]),
|
||||||
|
assert( cell_stream( Error) ),
|
||||||
|
% set_prolog_flag(user_input,_Input),
|
||||||
|
set_prolog_flag(user_output, Output),
|
||||||
|
set_prolog_flag(user_error, Error).
|
||||||
|
streams(true).
|
||||||
|
|
||||||
ready(_Self, Line ) :-
|
ready(_Self, Line ) :-
|
||||||
blank( Line ),
|
blank( Line ),
|
||||||
|
@ -496,8 +496,10 @@ class YAPCompleter(Completer):
|
|||||||
self.matches = []
|
self.matches = []
|
||||||
prolog_res = self.shell.yapeng.mgoal(completions(text, self), "user",True)
|
prolog_res = self.shell.yapeng.mgoal(completions(text, self), "user",True)
|
||||||
if self.matches:
|
if self.matches:
|
||||||
|
print( text, magic_res )
|
||||||
return text, self.matches
|
return text, self.matches
|
||||||
magic_res = self.magic_matches(text)
|
magic_res = self.magic_matches(text)
|
||||||
|
print( text, magic_res )
|
||||||
return text, magic_res
|
return text, magic_res
|
||||||
|
|
||||||
|
|
||||||
@ -535,6 +537,7 @@ class YAPRun:
|
|||||||
# construct a self.queryuery from a one-line string
|
# construct a self.queryuery from a one-line string
|
||||||
# self.query is opaque to Python
|
# self.query is opaque to Python
|
||||||
try:
|
try:
|
||||||
|
print(query,s, file=sys.stderr)
|
||||||
program,query,stop,howmany = self.prolog_cell(s)
|
program,query,stop,howmany = self.prolog_cell(s)
|
||||||
found = False
|
found = False
|
||||||
if s != self.os:
|
if s != self.os:
|
||||||
@ -545,10 +548,12 @@ class YAPRun:
|
|||||||
self.query = self.yapeng.query( pg)
|
self.query = self.yapeng.query( pg)
|
||||||
self.query.port = "call"
|
self.query.port = "call"
|
||||||
self.query.answer = {}
|
self.query.answer = {}
|
||||||
|
print("new", file=sys.stderr)
|
||||||
else:
|
else:
|
||||||
self.query.port = "retry"
|
self.query.port = "retry"
|
||||||
self.os = s
|
self.os = s
|
||||||
howmany += self.iterations
|
howmany += self.iterations
|
||||||
|
print('old', file=sys.stderr)
|
||||||
while self.query.next():
|
while self.query.next():
|
||||||
answer = self.query.answer
|
answer = self.query.answer
|
||||||
found = True
|
found = True
|
||||||
@ -696,7 +701,7 @@ class YAPRun:
|
|||||||
if linec:
|
if linec:
|
||||||
self.shell.run_line_magic(magic, line)
|
self.shell.run_line_magic(magic, line)
|
||||||
else:
|
else:
|
||||||
print("txt0: ",txt0,"\n")
|
print("txt0: ",txt0,"\n", file=sys.stderr)
|
||||||
if len(txt0) == 1:
|
if len(txt0) == 1:
|
||||||
cell = ""
|
cell = ""
|
||||||
else:
|
else:
|
||||||
@ -730,7 +735,7 @@ class YAPRun:
|
|||||||
self.yapeng.mgoal(streams(False),"user", True)
|
self.yapeng.mgoal(streams(False),"user", True)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
has_raised = True
|
has_raised = True
|
||||||
self.yapeng.mgoal(streams("off"),"user")
|
self.yapeng.mgoal(streams(False),"user")
|
||||||
if state:
|
if state:
|
||||||
self.shell.last_execution_succeeded = True
|
self.shell.last_execution_succeeded = True
|
||||||
self.result.result = (True, dicts)
|
self.result.result = (True, dicts)
|
||||||
|
Reference in New Issue
Block a user