1% ===================================================================
    2% File 'parser_all.pl'
    3% Purpose: English to KIF conversions from SWI-Prolog  
    4% This implementation is incomplete
    5% Maintainer: Douglas Miles
    6% Contact: $Author: dmiles $@users.sourceforge.net ;
    7% Version: 'parser_all.pl' 1.0.0
    8% Revision:  $Revision: 1.3 $
    9% Revised At:   $Date: 2002/06/06 15:43:15 $
   10% ===================================================================
   11
   12:- module(parser_sharing,[term_expansion/4,
   13   op(1150,fx,(share_mp)),
   14   op(1150,fx,(shared_parser_data)),
   15   op(1150,fx,(dynamic_multifile_exported))]).   16
   17:- ensure_loaded(nl_pipeline).   18
   19:- module_transparent(each_parser_module_1/1).   20each_parser_module(M):- no_repeats(each_parser_module_0(M)).
   21:- module_transparent(each_parser_module_0/1).   22each_parser_module_0(baseKB).
   23each_parser_module_0(parser_shared).
   24each_parser_module_0(parser_all).
   25each_parser_module_0(M):- each_parser_module_1(E),default_module(E,M).
   26%each_parser_module_0(M):- current_module(M).
   27:- module_transparent(each_parser_module/1).   28each_parser_module_1(M):- strip_module(_,M,_).
   29each_parser_module_1(M):- '$current_source_module'(M).
   30each_parser_module_1(M):- '$current_typein_module'(M).
   31
   32:- module_transparent(predicate_visible_home/2).   33predicate_visible_home(H,M):- predicate_property(H,imported_from(M)),!.
   34predicate_visible_home(H,M):- predicate_property(H,defined),strip_module(H,M,_), \+ predicate_property(H,imported_from(_)),!.
   35predicate_visible_home(H,M):- each_parser_module(M),predicate_property(M:H,defined), \+ predicate_property(M:H,imported_from(_)),!. 
   36
   37:- module_transparent(pi_p/2).   38pi_p(X,_):- \+ compound(X),!,fail.
   39pi_p('//'(F,A),P):-!,atom(F),integer(A),AA is A +2,functor(P,F,AA).
   40pi_p(F/A,P):- !,atom(F),integer(A),functor(P,F,A).
   41pi_p(M:PI,M:P):-!,pi_p(PI,P).
   42
   43:- module_transparent(pi_2_p/2).   44pi_2_p(P,P):- \+ callable(P),!.
   45pi_2_p(M:I,M:I):-!.
   46pi_2_p(I,M:I):- pi_p(I,P),predicate_visible_home(P,M),!.
   47pi_2_p(P,P).
   48
   49
   50pi_splits(X,_,_):- \+ compound(X),!,fail.
   51pi_splits([X,Y],X,Y):-!.
   52pi_splits([],nil,nil):-!.
   53pi_splits([X],X,nil):-!.
   54pi_splits([X|Y],X,Y):-!,nonvar(X).
   55pi_splits((X,Y),X,Y):-!.
   56pi_splits(M:XY,M:X,M:Y):- pi_splits(XY,X,Y),!.
   57
   58
   59:- op(1150,fx,user:(share_mp)).   60:- op(1150,fx,baseKB:(share_mp)).   61
   62:- module_transparent((share_mp)/1).   63share_mp(nil):- !.
   64share_mp(XY):- pi_splits(XY,X,Y),!,share_mp(X),share_mp(Y).
   65share_mp(XY):- pi_p(XY,PI),!,share_mp(PI).
   66share_mp(MP):- strip_module(MP,M,P),share_mp(M,P).
   67
   68import_and_export(CM,M:F/A):- 
   69   must(M:export(M:F/A)),
   70   (CM\==M-> CM:import(M:F/A) ; true),
   71   CM:export(M:F/A),!.
   72
   73
   74:- module_transparent((share_mp)/2).   75share_mp(_,nil):-!.
   76share_mp(M,XY):- pi_splits(XY,X,Y),!,share_mp(M,X),share_mp(M,Y).
   77share_mp(CM,(M:P)):- !, atom(M),share_mp(M,P),(CM==M->true;import_and_export(CM,M:P)).
   78share_mp(M,PI):- pi_p(PI,P)->PI\==P,!,share_mp(M,P).
   79share_mp(M,P):- functor(P,F,A), MFA=M:F/A,
   80   (M:multifile(M:MFA)), 
   81   (M:module_transparent(MFA)),
   82   (M:export(MFA)),
   83   (M:public(MFA)),   
   84   import_and_export(parser_sharing,MFA),
   85   import_and_export(parser_all,MFA),
   86   '$current_source_module'(SM),import_and_export(SM,MFA),
   87   '$current_typein_module'(CM),import_and_export(CM,MFA),
   88   import_and_export(system,MFA),
   89   !.
   90
   91:- share_mp((share_mp)/1).   92:- share_mp((share_mp)/2).   93
   94
   95:- op(1150,fx,user:(shared_parser_data)).   96:- op(1150,fx,baseKB:(shared_parser_data)).   97:- module_transparent((shared_parser_data)/1).   98
   99shared_parser_data(XY):- assertion(compound(XY)),fail.
  100shared_parser_data(XY):- pi_splits(XY,X,Y),!,shared_parser_data(X),shared_parser_data(Y).
  101shared_parser_data(XY):- pi_p(XY,PI)-> XY\==PI,!,shared_parser_data(PI).
  102shared_parser_data(MP):- predicate_visible_home(MP,M)->strip_module(MP,Imp,P),MP\==M:P,!, functor(P,F,A),M:export(M:F/A),shared_parser_data(M:P),Imp:import(M:P).
  103shared_parser_data(M:P):- !,def_parser_data(M,P),strip_module(_,Imp,_),functor(P,F,A),M:export(M:F/A),Imp:import(M:P).
  104% shared_parser_data(P):- each_parser_module(M),predicate_property(M:P,defined), \+ predicate_property(M:P,imported_from(_)),!,shared_parser_data(M:P).
  105shared_parser_data(P):- get_query_from(SM),shared_parser_data(SM:P).
  106:- share_mp((shared_parser_data)/1).  107
  108
  109
  110:- op(1150,fx,user:(dynamic_multifile_exported)).  111:- op(1150,fx,baseKB:(dynamic_multifile_exported)).  112:- module_transparent((dynamic_multifile_exported)/1).  113dynamic_multifile_exported(MP):- shared_parser_data(MP).
  114:- share_mp((dynamic_multifile_exported)/1).  115
  116
  117:- module_transparent(find_predicate_module/2).  118find_predicate_module(P,MP):-find_predicate_module_maybe(MP,P),!.
  119:- share_mp(find_predicate_module/2).  120
  121:- module_transparent(find_predicate_module_maybe/2).  122find_predicate_module_maybe(MPO,F/A):-!, functor(P,F,A),find_predicate_module_maybe(MPO,P).
  123find_predicate_module_maybe(MPO,M:F/A):-!, functor(P,F,A),find_predicate_module_maybe(MPO,M:P).
  124find_predicate_module_maybe(M:P,MP):-  predicate_property(MP,imported_from(M)),!,strip_module(MP,_,P).
  125find_predicate_module_maybe(M:P,M:P):- !, predicate_property(M:P,defined), \+ predicate_property(M:P,imported_from(_)),!.
  126find_predicate_module_maybe(M:P,P):- each_parser_module(M),predicate_property(M:P,defined), \+ predicate_property(M:P,imported_from(_)),!.
  127find_predicate_module_maybe(MPO,P):- find_predicate_module_maybe(MPO,baseKB:P).
  128:- share_mp(find_predicate_module_maybe/2).  129
  130:- dynamic(using_shared_parser_data/2).  131use_shared_parser_data(User,File):- using_shared_parser_data(User,File),!.
  132use_shared_parser_data(User,File):- asserta(using_shared_parser_data(User,File)),!.
  133
  134:- module_transparent(use_shared_parser_data/0).  135use_shared_parser_data:- 
  136   prolog_load_context(module,User),
  137   ignore((source_location(File,_), use_shared_parser_data(User,File))), 
  138   ignore((prolog_load_context(source,File2), use_shared_parser_data(User,File2))), 
  139   ignore((prolog_load_context(file,File3), use_shared_parser_data(User,File3))).
  140
  141:- module_transparent(def_parser_data/2).  142def_parser_data(M,F/A):- !, assertion((atom(F),integer(A),functor(P,F,A))), def_parser_data(M,P).
  143def_parser_data(_,M:XY):- !, def_parser_data(M,XY).
  144def_parser_data(M,P):-
  145   use_shared_parser_data,
  146   ( \+ predicate_property(M:P,defined) -> define_shared_loadable_pred(M,P) ; true ),!.   
  147/*
  148def_parser_data(M,P):- throw(old_code),
  149   ( \+ predicate_property(M:P,defined) -> define_shared_loadable_pred(M,P) ; true ),   
  150   kb_shared(M:P),
  151   share_mp(M,P).
  152*/
  153:- share_mp(def_parser_data/2).  154
  155:- module_transparent(define_shared_loadable_pred/2).  156define_shared_loadable_pred(M,P):- current_prolog_flag(access_level,system),!,set_prolog_flag(access_level,user),
  157   define_shared_loadable_pred(M,P),set_prolog_flag(access_level,system).
  158
  159% define_shared_loadable_pred(M,P):- !, mpred_ain(isBorked==>M:P).
  160define_shared_loadable_pred(M,P):- % throw(old_code),
  161   '$current_source_module'(SM),'$current_typein_module'(CM),
  162   %mpred_ain(isBorked==>M:P),
  163   functor(P,F,A),dmsg(def_parser_data(sm=SM,cm=CM,m=M,F/A)),
  164   dynamic(M:P),multifile(M:P),discontiguous(M:P).
  165
  166:- module_transparent(show_shared_pred_info/1).  167show_shared_pred_info(FA):-
  168   prolog_load_context(module,User),
  169   (pi_p(FA,P);P=FA),!,
  170   functor(P,F,A),
  171   ((User:predicate_property(P,defined))->
  172       (predicate_property(P,number_of_clauses(N)),
  173         (N<20 -> User:listing(FA) ; dmsg(big(User,F/A)));
  174    dmsg(unkonw_number_of_clauses(User,F/A)));dmsg(undefined(User,F/A))),
  175   findall(PP,User:predicate_property(P,PP),PPL),dmsg(FA=PPL),!.
  176:- share_mp(show_shared_pred_info/1).  177
  178
  179:- module_transparent(importing_head/2).  180importing_head(H,H):- \+ callable(H),!.
  181importing_head(M:H,M:H):- !.
  182importing_head(H,M:H):- predicate_visible_home(H,M),!.
  183importing_head(H,H).
  184
  185:- module_transparent(importing_body/3).  186importing_body(_CM,B,B):- \+ callable(B),!.
  187importing_body(CM,(A,B),(AA,BB)):-!,importing_body(CM,A,AA),importing_body(CM,B,BB).
  188importing_body(CM,B,BB):- compound(B),
  189  CM:predicate_property(B,meta_predicate(MP)),!,
  190  B=..[F|EL],MP=..[F|ML],
  191  maplist(importing_body_lit(CM,MP),ML,EL,EEL),
  192  BB=..[F|EEL].
  193importing_body(_CM,B,B).
  194
  195:- module_transparent(importing_body_lit/5).  196importing_body_lit(_CM,_B,_Me,E,E):- \+ callable(E),!.
  197importing_body_lit(CM,_B,Int,E,EE):- integer(Int),!,importing_body(CM,E,EE).
  198importing_body_lit(CM,_B,(*),E,EE):- !,importing_body(CM,E,EE).
  199importing_body_lit(CM, B,(:),[H|T],[HH|TT]):- Meta = (:), !,importing_body_lit(CM,B,Meta,H,HH),importing_body_lit(CM,B,Meta,T,TT).
  200importing_body_lit(CM, B,(:),E,M:E):- functor(B,_,1),pi_p(E,P),CM:predicate_visible_home(P,M),!.
  201%importing_body_lit(_,_B,(:),E,E):- !.
  202importing_body_lit(_CM,_B,_,E,E).
  203
  204
  205:- module_transparent(importing_clause_change/2).  206importing_clause_change(I,OOO):- 
  207  notrace(importing_clause(I,O)),!, 
  208  differing_clauses(I,O,OOO),!.
  209
  210:- module_transparent(differing_clauses/3).  211differing_clauses(I,O,OOO):- 
  212 notrace((I\==O,
  213  expand_to_hb(I,IH,IB),
  214  expand_to_hb(O,OH,OB),
  215  strip_module(IH,WasIM,II),
  216  strip_module(OH,WasOM,OO),
  217  (II\==OO;IB\==OB;WasIM\==WasOM))),
  218  merge_hb(OO,OB,OHB),
  219  clean_te_module(IH,WasIM,II,OHB,WasOM,OOO),!.
  220
  221merge_hb(OH,OB,OH):- OB==true,!.
  222merge_hb(M:OH,OB,M:(OH:-OB)):-!.
  223merge_hb(OH,OB,(OH:-OB)).
  224
  225% clean_te_module(I,WasIM,II,O,WasOM,OO,OOO)
  226clean_te_module(I,WasIM,I,OO,WasOM,OO):- WasOM==WasIM,!.
  227clean_te_module(_, _   ,_,OO,WasOM,WasOM:OO).
  228  
  229
  230
  231:- module_transparent(importing_clause/2).  232importing_clause(H,H):- \+ callable(H),!.
  233importing_clause((:-B),(:-BB)):- !,strip_module(B,CM,_),importing_body(CM,B,BB).
  234importing_clause((H:-B),(HH:-BB)):- !, importing_head(H,HH),!,strip_module(HH,CM,_),importing_body(CM,B,BB).
  235importing_clause((H), (H)):- is_leave_alone(H),!.
  236importing_clause((H),(HH)):- importing_head(H,HH),!.
  237importing_clause((B),(BB)):- strip_module(B,CM,_),importing_body(CM,B,BB),!.
  238importing_clause(HB,HB).
  239:- share_mp(importing_clause/2).  240
  241is_leave_alone(H):- compound(H),functor(H,F,A),is_leave_alone(F,A).
  242%is_leave_alone('--->',_).
  243%is_leave_alone('-->',_).
  244is_leave_alone(A,_):- upcase_atom(A,A).
  245
  246term_expansion(G,I,GG,O):- notrace((nonvar(I),compound(G))),importing_clause_change(G,GG), I=O.
  247
  248:- fixup_exports.