1/*  
    2% ===================================================================
    3% File 'mpred_type_constraints.pl'
    4% Purpose: For Emulation of OpenCyc for SWI-Prolog
    5% Maintainer: Douglas Miles
    6% Contact: $Author: dmiles $@users.sourceforge.net ;
    7% Version: 'interface' 1.0.0
    8% Revision:  $Revision: 1.9 $
    9% Revised At:   $Date: 2002/06/27 14:13:20 $
   10% ===================================================================
   11% File used as storage place for all predicates which change as
   12% the world is run.
   13%
   14%
   15% Dec 13, 2035
   16% Douglas Miles
   17*/
   18
   19% File: /opt/PrologMUD/pack/logicmmtc_base/prolog/logicmoo/mpred/mpred_type_constraints.pl
   20%:- if(( ( \+ ((current_prolog_flag(logicmmtc_include,Call),Call))) )).
   21:- module(mpred_type_constraints,
   22          [ add_cond/2,           
   23            arg_to_var/3,
   24            attempt_attribute_args/3,
   25            attempt_attribute_args/5,
   26            attempt_attribute_one_arg/4,
   27            attribs_to_atoms/2,
   28            attribs_to_atoms0/2,
   29            cmp_memberchk_0/2,
   30            cmp_memberchk_00/2,
   31            comp_type/3,
   32            iz/2,
   33            extend_iz/2,
   34            extend_iz_member/2,
   35            init_iz/2,
   36            inst_cond/2,
   37            isa_pred_l/3,
   38            isa_pred_l/4,
   39            chk_cond/2,
   40            call_cond/2,
   41            condz_to_isa/2,
   42            map_subterms/3,
   43            max_cond/3,
   44            max_cond_l/2,
   45            dif_objs/2,
   46            min_cond/3,
   47            min_cond_l/2,
   48            promp_yn/2,
   49            same/2,
   50            same_arg/3,
   51            samef/2,
   52            to_functor/2,
   53            type_size/2,
   54            extract_conditions/2,
   55            
   56            unrelax/1, iz_member/1,
   57
   58            lazy/1,lazy/2,
   59
   60            constrain/1,enforce/1,
   61            
   62
   63            relax/1,relax_goal/2,thaw/1,
   64            mpred_type_constraints_file/0
   65          ]).   66
   67:- set_prolog_flag(generate_debug_info, true).   68
   69:- meta_predicate my_when(+,0).   70:- meta_predicate nrlc(0).   71:- meta_predicate prolog_current_choice(1,*).   72:- meta_predicate prolog_current_choice(1,*,*).   73:- meta_predicate xnr(0).   74:- meta_predicate xnr(*,0).   75%:- include('mpred_header.pi').
   76
   77% :- endif.
   78
   79:- use_module(library(logicmoo/common_logic/common_logic_snark)).   80
   81:- user:use_module(library(gvar_globals_api)).   82
   83:- module_transparent((
   84            add_cond/2,           
   85            arg_to_var/3,
   86            attempt_attribute_args/3,
   87            attempt_attribute_args/5,
   88            attempt_attribute_one_arg/4,
   89            attribs_to_atoms/2,
   90            attribs_to_atoms0/2,
   91            cmp_memberchk_0/2,
   92            cmp_memberchk_00/2,
   93            comp_type/3,
   94            iz/2,
   95            extend_iz/2,
   96            extend_iz_member/2,
   97            init_iz/2,
   98            inst_cond/2,
   99            isa_pred_l/3,
  100            isa_pred_l/4,
  101            chk_cond/2,
  102            call_cond/2,
  103            condz_to_isa/2,
  104            map_subterms/3,
  105            max_cond/3,
  106            max_cond_l/2,
  107            dif_objs/2,
  108            min_cond/3,
  109            min_cond_l/2,
  110            promp_yn/2,
  111            same/2,
  112            same_arg/3,
  113            samef/2,
  114            to_functor/2,
  115            type_size/2,
  116            extract_conditions/2,
  117            
  118            unrelax/1, iz_member/1,
  119
  120            lazy/1,lazy/2,
  121
  122            constrain/1,enforce/1,
  123
  124            relax/1,relax_goal/2,thaw/1,
  125            mpred_type_constraints_file/0)).  126
  127:- if(exists_source(library(multivar))).  128:- use_module(library(multivar)).  129:- endif.  130
  131:- if(exists_source(library(vhar))).  132:- use_module(library(vhar)).  133:- endif.  134
  135:- if(exists_source(library(vprox))).  136:- use_module(library(vprox)).  137:- endif.  138
  139
  140:- meta_predicate 
  141   isa_pred_l(+,*,*),
  142   isa_pred_l(+,*,*,*),
  143   map_subterms(+,?,?),
  144   iz_member(*),
  145   constrain(*),
  146   map_lits(1,+),
  147   boxlog_goal_expansion(*,*),
  148   map_each_argnum(?,4,?,?,*),
  149   map_argnums(?,4,*),
  150   thaw(?),
  151   lazy(*),
  152   unrelax(*),
  153   relax_goal(*,+),
  154   lazy(+,*).  155
  156:- meta_predicate relax(*),relaxing(*).  157
  158:- kb_local(baseKB:admittedArgument/3).  159
  160:- thread_local(t_l:no_kif_var_coroutines/1).  161
  162:- meta_predicate relaxed_call(*).  163
  164% ?- G=(loves(X,Y),~knows(Y,tHuman(X))),relax_goal(G,Out),writeq(Out).
  165
  166:- meta_predicate map_plits(1,*).  167map_lits(P1,Lit):- 
  168 locally($('$outer_stack')=[],once(map_plits(P1,Lit))),!.
  169
  170map_plits(P1,Lit):- \+ compound(Lit),!,call(P1,Lit).
  171map_plits(P1,[Lit1 |  Lit2]):- !,map_plits(P1,Lit1),map_plits(P1,Lit2).
  172map_plits(P1,(Lit1 ,  Lit2)):- !,map_plits(P1,Lit1),map_plits(P1,Lit2).
  173map_plits(P1,(Lit1 ;  Lit2)):- !,map_plits(P1,Lit1),map_plits(P1,Lit2).
  174map_plits(P1,(Lit1 :- Lit2)):- !,map_lits(P1,Lit1),with_outer(Lit1,0,map_plits(P1,Lit2)).
  175map_plits(P1, Expr) :- demodalfy_outermost(+,Expr,MExpr,_Outer),!,
  176   with_outer(Expr,1,map_plits(P1, MExpr)).
  177map_plits(P1, Expr) :- Expr=..[C,I], tCol(C),!,map_plits(P1, isa(I,C)).
  178map_plits(P1, Expr) :- functor(Expr,F,A),mappable_sentence_functor(F,A), !, Expr =.. [F|Args],
  179  map_meta_lit(F,1,P1,Args).
  180map_plits(P1,Lit):- call(P1,Lit).
  181
  182map_meta_lit(F,N,P1,[Arg|Args]):- !,
  183  with_outer(F,N,map_plits(P1, Arg)),
  184  N2 is N + 1,
  185  map_meta_lit(F,N2,P1,Args).
  186map_meta_lit(_,_,_,[]):-!.
  187
  188:- nb_setval('$outer_stack',[]).  189
  190with_outer(ExprF,N,Goal):- nb_current('$outer_stack',Was),
  191  locally($('$outer_stack')=[ExprF-N|Was],Goal).
  192
  193closure_push(Closure,Data):- var(Closure),!,add_cond(Closure,Data).
  194closure_push(Closure,Data):- Closure=[true|_Rest],!,setarg(1,Closure,Data).
  195closure_push(Closure,Data):- Closure=[_First|Rest],!,setarg(2,Closure,[Data|Rest]).
  196
  197constrain_arg_var(Closure,Arg,FA):- closure_push(Closure,add_cond(Arg,FA)).
  198
  199%push_modal(neg(_)):- nb_current('$modal_stack',[neg(_)|Was]),!, b_setval('$modal_stack',Was).
  200%push_modal(Modal):- nb_current('$modal_stack',Was)->b_setval('$modal_stack',[Modal|Was]);b_setval('$modal_stack',[Modal,call]).
  201%last_modal(Modal):- nb_current('$modal_stack',[Modal|_])-> true; Modal=call.
  202
  203map_argnums(_,_,Lit):- \+ compound(Lit), !.
  204map_argnums(Modal,P4,[Lit1 |  Lit2]):- !,map_argnums(Modal,P4,Lit1),map_argnums(Modal,P4,Lit2).
  205map_argnums(Modal,P4,isa(I,C)):- !,call(P4,Modal,C,0,I).
  206map_argnums(Modal,P4,Expr) :- demodalfy_outermost(Modal,Expr,MExpr,ModalValue),!,map_argnums(ModalValue,P4, MExpr).
  207map_argnums(Modal,P4,Expr) :- Expr=..[C,I], \+ (clause_b(argIsa(C,1,CC)),CC==C), clause_b(tCol(C)), !,map_argnums(Modal,P4,isa(I,C)).
  208map_argnums(Modal,P4,Expr) :- compound_name_arguments(Expr,F,Args),functor(Expr,F,A),
  209   (mappable_sentence_functor(F,A) -> map_argnums(Modal,P4,Args); map_each_argnum(Modal,P4,F,1,Args)).
  210
  211
  212map_each_argnum(Modal,P4,F,N,[Arg|Args]):- !,
  213   call(P4,Modal,F,N,Arg),
  214   N2 is N + 1,
  215   map_each_argnum(Modal,P4,F,N2,Args).
  216map_each_argnum(_Modal,_,_,_,_).
  217
  218
  219% non-backtracking attribute updates
  220 
  221
  222demodalfy_outermost(ModalIn,MExpr, Expr, ModalValue):-  MExpr=..[Modal,Expr], modal_value(ModalIn,Modal,ModalValue).
  223modal_value(neg(_), Neg , true):- arg(_,v( ( \+ ),'~','-','not'),Neg).
  224modal_value(_, Neg , neg(Neg)):- arg(_,v( ( \+ ),'~','-','not'),Neg).
  225
  226mappable_sentence_functor(call,1).
  227mappable_sentence_functor(=,2):-!,fail.
  228mappable_sentence_functor(call_u,1).
  229mappable_sentence_functor(F,_):- downcase_atom(F,DC),upcase_atom(F,DC).
  230%mappable_sentence_functor(F,1):- \+ tCol(F).
  231%mappable_sentence_functor(F,A):- \+ argIsa(F,A,_).
  232
  233%mtc_put_iza(X,Z):- Z=[id(ID)|_],nonvar(ID),!,put_attr(X,iza,Z).
  234%mtc_put_iza(X,Z):- get_attr(X,iza,[id(ID)|_]),put_attr(X,iza,[id(ID)|Z]).
  235%mtc_put_iza(X,Z):- gensym(id_,ID),!,put_attr(X,iza,[id(ID)|Z]).
  236
  237
  238mtc_put_iza(X,Z):- put_attr(X,iza,Z).
  239
  240mtc_put_attr(X,iza,Z):- mtc_get_attr(X,iza,_Prev),!, mtc_put_iza(X,Z).
  241mtc_put_attr(X,iza,Z):- !, mtc_put_iza(X,[iza_id(X)|Z]).
  242mtc_put_attr(X,Y,Z):- var(X),!,oo_put_attr(X,Y,Z).
  243mtc_put_attr(X,Y,Z):- oo_put_attr(X,Y,Z),nop(dmsg(warn(need_to_error(oo_put_attr(X,Y,Z))))).
  244
  245mtc_get_attr(X,Y,Z):- var(X),!,oo_get_attr(X,Y,Z).
  246mtc_get_attr(X,Y,Z):- oo_get_attr(X,Y,Z),nop(dmsg(warn(need_to_fail(oo_get_attr(X,Y,Z))))),!,fail.
  247
  248
  249mtc_get_attvar(Dom1,X):-memberchk(iza_id(X),Dom1).
  250
  251compound_lit(Arg):- compound(Arg).
  252
  253% ========================================================================
  254% enforce_bound(G)  = check constraints
  255% ========================================================================
  256:- export(enforce_bound/1).  257enforce_bound(G):-args_enforce_bound(G,Closure),maplist(call,Closure).
  258
  259:- during_boot(add_history(( 
  260  G=(loves(X,Y),~knows(Y,tHuman(X))),must(args_enforce_bound(G,Out)),writeq(Out)
  261   ))).
  262
  263:- export(args_enforce_bound/2).  264args_enforce_bound(G,Closure):- ignore(Closure=[true]),map_argnums(pos(_),args_enforce_bound3(Closure),G).
  265
  266args_enforce_bound3(Closure,Modal,C,0,I):- !, ignore(( nonvar(I),
  267   (Modal\=pos(_)  -> closure_push(Closure,modal_isa(I,C)) ; closure_push(Closure,isa(I,C))))).
  268args_enforce_bound3(Closure,Modal,_F,_A,Arg):- compound_lit(Arg),!,map_argnums(Modal,args_enforce_bound3(Closure),Arg).
  269args_enforce_bound3(_Closure,_Modal,_F,_A,Arg):- var(Arg),!.
  270args_enforce_bound3(Closure,Modal,F,A,Arg):-args_enforce_nonvar(Closure,Modal,F,A,Arg).
  271
  272
  273% ========================================================================
  274% constrain(G)  = add constraints to free args
  275% ========================================================================
  276:- export(constrain/1).  277constrain(G):-ground(G),!.
  278constrain(G):-args_constrain(G,Closure),maplist(call,Closure).
  279
  280:- export(args_constrain/2).  281:- during_boot(add_history(( 
  282  G=(loves(X,Y),~knows(Y,tHuman(X))),must(args_constrain(G,Out)),writeq(Out)
  283   ))).
  284
  285args_constrain(G,Closure):- ignore(Closure=[true]),map_argnums(pos(_),args_constrains3(Closure),G).
  286
  287
  288args_constrains3(Closure,Modal,C,0,I):- !,
  289   (Modal\=pos(_)  -> constrain_arg_var(Closure,I,does_exist(I)) ; constrain_arg_var(Closure,I,isa(I,C))).
  290args_constrains3(Closure,Modal,_F,_A,Arg):- compound_lit(Arg),!,map_argnums(Modal,args_constrains3(Closure),Arg).
  291args_constrains3(_Closure,_Modal,_F,_A,Arg):- nonvar(Arg),!.
  292args_constrains3(Closure,Modal,F,A,Arg):-args_constrain_var(Closure,Modal,F,A,Arg).
  293   
  294:- export(does_exist/1).  295does_exist(_).
  296modal_admittedArgument(F,1,V):-!,admittedArgument(F,1,V).
  297modal_admittedArgument(_,_,_).
  298% ========================================================================
  299% enforce(G)  = enforce_bound/1 + constrain/1
  300% ========================================================================
  301:- export(enforce/1).  302enforce(G):-args_enforce(G,Closure),maplist(call,Closure).
  303
  304
  305:- during_boot(add_history(( 
  306  G=(loves(X,Y),~knows(Y,tHuman(X))),must(args_enforce(G,Out)),writeq(Out)
  307   ))).
  308
  309:- export(args_enforce/2).  310args_enforce(G,Closure):- ignore(Closure=[true]),map_argnums(pos(_),args_enforces3(Closure),G).
  311
  312args_enforces3(Closure,Modal,C,0,I):- !,
  313   (Modal\=pos(_)  -> constrain_arg_var(Closure,I,does_exist(I)) ; constrain_arg_var(Closure,I,isa(I,C))).
  314args_enforces3(Closure,Modal,_F,_A,Arg):- compound_lit(Arg),!,map_argnums(Modal,args_enforces3(Closure),Arg).
  315args_enforces3(Closure,Modal,F,A,Arg):- var(Arg),!, args_constrain_var(Closure,Modal,F,A,Arg).
  316args_enforces3(Closure,Modal,F,A,Arg):- args_enforce_nonvar(Closure,Modal,F,A,Arg).
  317 
  318
  319
  320% ========================================================================
  321% remove_constraints(G)  = remove constraints 
  322% ========================================================================
  323remove_constraints(G):-args_remove_constraints(G,Closures),maplist(ignore,Closures).
  324
  325:- export(args_remove_constraints/2).  326:- during_boot(add_history(( 
  327                            G=(loves(X,Y),~knows(Y,tHuman(X))),args_enforce(G,Out),writeq(Out),
  328                            args_remove_constraints(G,Out2),writeq(Out2)
  329  
  330   ))).
  331
  332args_remove_constraints(G,Closure):- ignore(Closure=[true]),map_argnums(pos(_),args_remove_constraints3(Closure),G).
  333
  334args_remove_constraints3(Closure,_Modal,C,0,I):- !, transfer_constraints(Closure,I),transfer_constraints(Closure,C).
  335args_remove_constraints3(Closure,Modal,_F,_A,Arg):- compound_lit(Arg),!,map_argnums(Modal,args_remove_constraints3(Closure),Arg).
  336args_remove_constraints3(Closure,_Modal,_F,_A,Arg):- transfer_constraints(Arg,Closure).
  337
  338transfer_constraints(Arg,Closure):- ignore((var(Arg),mtc_get_attr(Arg,iza,ToDo),del_attr(Arg,iza),
  339   maplist(constrain_arg_var(Closure,Arg),ToDo))).
  340
  341%:- module_transparent(apply:maplist/2).
  342%:- module_transparent(apply:maplist/3).
 args_constrain_var(?Closure, +Modal, +F, +A, +Arg) is det
Datalog Preconditional Expansion.
  349args_constrain_var(Closure,Modal,F,A,Arg):- (A==1 ; Modal=pos(_)),
  350    argIsa(F,A,Type),!,constrain_arg_var(Closure,Arg,isa(Arg,Type)).
  351
  352args_constrain_var(Closure,Modal,F,A,Arg):- 
  353   (Modal\=pos(_)  ->
  354       constrain_arg_var(Closure,Arg,modal_admittedArgument(F,A,Arg)) ;
  355       constrain_arg_var(Closure,Arg,    admittedArgument(F,A,Arg))).
 args_enforce_nonvar(?Closure, +Modal, +F, +A, +Arg) is det
Datalog Preconditional Expansion.
  361args_enforce_nonvar(Closure,Modal,F,A,Arg):-
  362   (Modal\=pos(_)  ->
  363       closure_push(Closure,modal_admittedArgument(F,A,Arg)) ;
  364       closure_push(Closure,    admittedArgument(F,A,Arg))).
 extract_conditions(+PFCSentence, -Conds) is semidet
Datalog Preconditional Expansion.
  371extract_conditions(Sentence,Conds):- 
  372 copy_term(Sentence,Sentence,Goals),
  373 list_to_set(Goals,GoalSet),
  374 (Goals\==GoalSet-> dmsg(cons_odd) ; true),
  375 list_to_conjuncts(GoalSet,Conds),!.
 boxlog_goal_expansion(?G, ?GG) is semidet
Datalog Goal Expansion.
  381boxlog_goal_expansion(relax(G),GG):-!,relax_goal(G,GG).
  382%boxlog_goal_expansion(G,GG):-!,relax_goal(G,GG).
  383/* 
  384boxlog_goal_expansion(G,_):- % \+ source_location(_,_),
  385  wdmsg(g_s(G)),fail.
  386*/
  387
  388
  389is_iz_or_iza(Var):- zotrace((mtc_get_attr(Var,iz,_);mtc_get_attr(Var,iza,_))).
 relax(:GoalG) is det
Relaxen.
  395relax(G):- map_lits(relax_lit,G).
  396
  397relaxing(G):- term_attvars(G,Gs),quietly(relax(G)),term_attvars(G,Gs0),!,Gs0\==Gs.
  398
  399relax_lit(G):- var(G),!.
  400relax_lit(_:G):-!,relax_lit(G).
  401relax_lit(G):- G=..[_|ARGS],relax_args(G,1,ARGS).
 relaxed_call(:GoalG) is nondet
  407relaxed_call(G):- relax(G), (G *-> unrelax(G) ; (unrelax(G),!,fail)).
 relax_goal(:GoalG) is det
Relaxen Goal.
  415relax_goal(G,GG):- copy_term(G,GG),relax(GG).
  416
  417
  418relax_goal_alt_old(G,GGG):-
  419  copy_term(G,GG,Gs),G=GG,G=..[_|ARGS],relax_args(GG,1,ARGS),   
  420  GGG=(GG,maplist(iz_member,Gs)).
  421
  422
  423%  ?- G=loves(a,b),relax_lit(G).
 relax_N(?G, ?N, ?A) is semidet
Relaxen Argument.

% relax_N(G,N,Val):- var(Val),!,setarg(N,G,Val). % relax_N(G,N,Val):- iz(AA,[Val]),!,nb_setarg(N,G,AA).

  435relax_N(_,_,Val):- var(Val),!, ((mtc_get_attr(Val,iz,_);mtc_get_attr(Val,iza,_))->true;mtc_put_attr(Val,iz,[_])).
  436relax_N(G,N,Val):- dont_relax(Val)->true;(nb_setarg(N,G,NewVar),put_value(NewVar,Val)).
  437
  438:- if(exists_source(library(multivar))).  439% put_value(Var,Value):- multivar(Var),iz(Var,[Value]),mv_set1(Var,Value).
  440
  441% put_value(Var,Value):- Var==Value,!.
  442put_value(Var,Value):- is_dict(Value,Tag),!,
  443     (Tag==Var->true;put_value(Var,Tag)),
  444     dict_pairs(Value,_Tag2,Pairs),
  445     maplist(put_value_attr(Var),Pairs).
  446put_value(Var,Value):- iz(Var,[Value]).
  447
  448put_value_attr(Var,N-V):- put_attr_value(Var,N,V).
  449put_attr_value(Var,iza,V):- !, add_cond(Var,V).
  450put_attr_value(Var,iz,V):- !, iz(Var,V).
  451put_attr_value(Arg,Name,FA):- as_constraint_for(Arg,FA,Constraint),!,put_attr_value0(Arg,Name,Constraint).
  452
  453put_attr_value0(Var,Name,HintE):- 
  454  (mtc_get_attr(Var,Name,HintL) -> min_cond(HintE,HintL,Hint); Hint=[HintE]), !,
  455   mtc_put_attr(Var,Name,Hint).
  456
  457
  458
  459:- else.  460 put_value(Var,Value):- iz(Var,[Value]).
  461:- endif.  462
  463dont_relax(A):- var(A),!,is_iz_or_iza(A).
  464dont_relax(A):- \+ compound(A), \+ atom(A), \+ string(A).
 relax_args(?G, ?N, :TermA) is semidet
Relaxen Arguments.
  470relax_args(G,N,[A|RGS]):-relax_N(G,N,A),!,N2 is N + 1,relax_args(G,N2,RGS).
  471relax_args(_,_,[]).
  472
  473%:- set_prolog_flag(verbose_file_search,true).
  474:- user:use_module(library(clpfd),except([ins/2,sum/3,op(_,_,_)])).		% Make predicates defined
  475%:- absolute_file_name(library('clp/clpr.pl'),File),writeln(File).
  476%:- use_module(user:library(clpr)).		% Make predicates defined
  477:- use_module(library(clpr),except([{}/1])).		% Make predicates defined
  478:- use_module(user:library(simplex)).		% Make predicates defined
  479
  480%:- set_prolog_flag(verbose_file_search,false).
  481
  482:- meta_predicate lazy_pfa(*,+,*).  % arg1 was 0
  483:- meta_predicate #(*).  %  was 0
  484'#'(G):- map_lits(lazy,G).
  485
  486my_when(If,Goal):- when(If,Goal).
 lazy(:GoalG) is semidet
Lazy.
  492lazy(G):- var(G),!,freeze(G,lazy(G)).
  493lazy(G):- ground(G),!,call(G).
  494lazy(is(X,G)):- !,clpr:{X =:= G}.
  495% lazy(is(X,G)):-!,term_variables(G,Vs),lazy(Vs,is(X,G)).
  496lazy(G):- functor(G,F,A),lazy_pfa(G,F,A).
  497
  498clp_r_arithmetic(=<).
  499clp_r_arithmetic(=:=).
  500clp_r_arithmetic( := ).
  501clp_r_arithmetic(<).
  502clp_r_arithmetic(>=).
  503clp_r_arithmetic(>).
  504
  505lazy_pfa(G,F,2):- clp_r_arithmetic(F),!,clpr:{G}.
  506lazy_pfa(G,_,1):- term_variables(G,[V1|Vs1]),!,
  507      (Vs1 = [V2|Vs0] -> lazy([V1,V2|Vs0],G)
  508                      ; freeze(V1,G)).
  509lazy_pfa(G,_,_):- term_variables(G,[V1|Vs1]),
  510      (Vs1 = [V2|Vs0] -> lazy([V1,V2|Vs0],G)
  511                      ; freeze(V1,G)).
 lazy(?V, :GoalG) is semidet
Lazy.
  517lazy([V],G):- !, freeze(V,G).
  518%lazy([V|Vs],G):- or_any_var([V|Vs],C)->when(C,lazy(G)).
  519lazy([V|Vs],G):- !, lazy(Vs,freeze(V,G)).
  520lazy(_,G):- call(G).
  521
  522
  523or_any_var([V],nonvar(V)).
  524or_any_var([V|Vs],(nonvar(V);C)):-or_any_var(Vs,C).
  525
  526% test  lazy(isa(X,Y)),!,X=tCol,melt(Y).
 thaw(?G) is semidet
Thaw.
  532thaw(G):- call_residue_vars(G,Vs),maplist(melt,Vs).
 melt(?G) is semidet
melt.
  539melt(V):-frozen(V,G),call(G).
  540
  541/*
  542  call_grounded_constraints,disable_callable_constraints,call_universals,call_each_with_ignore,
  543  
  544  call newly grounded_constraints  
  545  
  546  enable_callable_constraints
  547  call_unground_constraints
  548
  549*/
  550
  551nonground(G):- \+ ground(G).
  552enable_reactions(V):- put_attr(V,enable_reactions,true).
  553disable_reactions(V):- put_attr(V,enable_reactions,false).
  554
  555:- meta_predicate(mpred_label(:)).  556:- module_transparent(mpred_label/1).  557:- meta_predicate(mpred_label(+,:)).  558:- module_transparent(mpred_label/2).  559mpred_label(M:G):- term_attvars(G,Vars),maplist(mpred_label_var(M,pre),Vars),maplist(mpred_label_var(M,post),Vars).
  560mpred_label(How,M:G):- term_attvars(G,Vars),maplist(mpred_label_var(M,How),Vars).
  561
  562:- module_transparent(mpred_label_var/3).  563mpred_label_var(M,pre,V):-
  564   obtain_conds(V,List),!,
  565   put_attr(V,iza,[]),
  566   maplist(call_when_and_save(M,V,ground),List,MidList),
  567   maplist(call_when_and_save(M,V,nonground),MidList,NewMidList),
  568   maplist(call_when_and_save(M,V,nonground),NewMidList,NewList),
  569   put_attr(V,iza,NewList).
  570
  571mpred_label_var(M,while,V):-   
  572   obtain_conds(V,List),!,
  573   maplist(call_when_and_save(M,V,ground),List,MidList),
  574   maplist(call_when_and_save(M,V,nonground),MidList,NewMidList),
  575   maplist(call_when_and_save(M,V,nonground),NewMidList,NewList),
  576   put_attr(V,iza,NewList).
  577
  578mpred_label_var(M,post,V):-
  579   obtain_conds(V,List),
  580   put_attr(V,iza,[]),!,
  581   maplist(call_when_and_save(M,V,ground),List,MidList),
  582   maplist(call_when_and_save(M,V,nonground),MidList,NewMidList),
  583   maplist(call_when_and_save(M,V,nonground),NewMidList,NewList),
  584   put_attr(V,iza,NewList).
  585
  586mpred_label_var(M,Stage,V):- 
  587   obtain_conds(V,List),
  588   maplist(call_when_and_save(M,V,Stage),List,NewList),
  589   put_attr(V,iza,NewList).
  590
  591
  592call_when_and_save(M,V,When,Cond,Cond):- M:call(When,Cond)-> call_and_save_as_proof(M,V,Cond,Cond) ; true.
  593
  594call_and_save_as_proof(_,_,call(proved,_),_CCond):- !.
  595call_and_save_as_proof(M,_,call(call,_),CCond):- !, M:call(CCond),setarg(1,CCond,proved).
  596call_and_save_as_proof(M,_V,call(ignore,_),CCond):-  (M:call(CCond)->setarg(1,CCond,proved);true).
  597call_and_save_as_proof(_,_V,aoc(_SK,_What),_CCond):-!.
  598call_and_save_as_proof(M,_V,dif_objs(X,Y),_CCond):- !, M:dif_objs(X,Y).
  599call_and_save_as_proof(M,_,CCond,CCond):- M:call(CCond),!.
 inst_cond(?X, ?List) is semidet
An attributed variable with attribute value DVar has been

assigned the value Y

Inst Isac.

  612inst_cond(X, List):- predsort(comp_type,List,SList),call_cond(X,SList).
  613
  614
  615iza_id(_).
  616
  617:- module_transparent unify_attr_iza/2.  618:- module_transparent unify_attr_iza/3.  619:- module_transparent unify_attr_iza_1/3.  620:- module_transparent iza:attr_unify_hook/2.  621
  622iza:attr_unify_hook(DVar, Y):- unify_attr_iza(DVar, Y).
  623unify_attr_iza(Dom1, Y):- show_failure(mtc_get_attvar(Dom1,Self)),!,unify_attr_iza_self(Self,Dom1, Y).
  624unify_attr_iza(Dom1, Y):-
  625  dumpST,
  626  dmsg(lhs=(Dom1)),
  627  dmsg(rhs=(Y)),
  628  must(show_failure(attvar(Y))),!,
  629  mtc_put_attr(Y, iza, Dom1 ).
  630
  631unify_attr_iza_self(Self,Dom1, Y):- atom(Y),as_existential(Y,YY),% isNamed(YY,What),!,
  632   mtc_get_attr(YY, iza, Dom2),!,
  633   unify_conds(Dom1,Dom2,Result1),!,
  634   unify_conds(Dom2,Dom1,Result2),!,
  635   mtc_put_attr(YY, iza, Result2),
  636   mtc_put_attr(Self, iza, Result1).
  637   
  638
  639unify_attr_iza_self(Self,Dom1, Y):- is_existential(Y),=(Y,YY),!,
  640   mtc_get_attr(YY, iza, Dom2),!,
  641   unify_conds(Dom1,Dom2,Result1),!,
  642   unify_conds(Dom2,Dom1,Result2),!,
  643   mtc_put_attr(YY, iza, Result2),
  644   mtc_put_attr(Self, iza, Result1).
  645
  646
  647unify_attr_iza_self(Self,Dom1, Y):- nonvar(Y),isNamed(Y,What),!,
  648  (attvar(Self)-> \+ \+ (((attv_bind(Self,Y),chk_cond(Y,Dom1)))) ; chk_cond(Y,Dom1)),!,
  649  add_cond(Self,aoc(isName,What)).
  650
  651unify_attr_iza_self(Self,Dom1, Y):- 
  652  must(show_failure(var(Self))),
  653  (show_failure(attvar(Y))),!,
  654  mtc_put_attr(Y, iza, Dom1 ).
  655unify_attr_iza_self(_Self,Dom1, Y):- chk_cond(Y,Dom1).
  656
  657
  658
  659local_memberchk_variant(H,Dom1):- memberchk_variant(H,Dom1).
  660
  661:- module_transparent unify_conds/3.  662unify_conds(Dom1,Dom2,Dom1):- Dom1=@=Dom2,!.
  663unify_conds(Dom1,[],Dom1):-!.
  664unify_conds(Dom1,[H|Dom2],NewDomain):- local_memberchk_variant(H,Dom1),!,unify_conds(Dom1,Dom2,NewDomain).
  665unify_conds(Dom1,[H|Dom2],NewDomain):- \+ rejects_cond(H,Dom1),!,
  666   unify_conds(Dom1,Dom2,NewDomain1),
  667   (private_cond(H) -> NewDomain1=NewDomain ;
  668   \+ local_cond(H) -> ord_union(NewDomain1,[H],NewDomain) ;
  669   \+ memberchk_variant(H,Dom1) -> ord_union(NewDomain1,[H],NewDomain) ;
  670   NewDomain1=NewDomain).
  671   
  672
  673hide_unify_conds(Dom1,Dom2,NewDomain):- show_failure(( \+ disjoint_conds(Dom1,Dom2))),
  674   % sanity(must(\+ disjoint_conds(Dom2,Dom1))), % ensure the checks got both ways
  675   ord_union(Dom1, Dom2, NewDomain).
  676
  677
  678get_typeinfos(Var,List):- obtain_conds(Var,Pre),include(is_typeinfo,Pre,List).
  679get_post_labeling(Var,List):- obtain_conds(Var,Pre),exclude(is_typeinfo,Pre,List).
  680
  681
  682is_typeinfo(Pre):- compound(Pre),!,functor(Pre,_,1).
  683is_typeinfo(Pre):- atom(Pre),!.
  684
  685% add_all_differnt(QuantsList):-  bagof(differentFromAll(I,O),QuantsList,O),L),maplist(call,L).
  686add_all_differnt(QuantsList):- 
  687   maplist(add_all_differnt2(QuantsList),QuantsList),!.
  688
  689add_all_differnt2(QuantsList,Ex):-
  690    delete_eq(QuantsList,Ex,DisjExs),
  691    differentFromAll(Ex,DisjExs).
  692
  693
  694add_cond_differentFromAll(Ex,DisjExs):- add_cond(Ex,differentFromAll(Ex,DisjExs)).
  695
  696differentFromAll(One,List):- maplist(dif_objs(One),List).
 dif_objs(?A, ?B) is semidet
Mdif.

dif_objs(A,B):- tlbugger:attributedVars,!,dif(A,B).

  705dif_objs(A,B):- A==B,!,fail.
  706dif_objs(A,B):- obtain_object_conds(A,B,Dom1,Dom2),!, 
  707 dif_objs_doms(Dom1,Dom2).
  708dif_objs(A,B):- dif(A,B),add_cond(A,dif_objs(A,B)),add_cond(B,dif_objs(B,A)).
  709
  710dif_objs_doms(Dom1,Dom2):- ((member(aoc(SK,N1),Dom1),memberchk(aoc(SK,N2),Dom2),N1=@=N2)),!,fail.
  711dif_objs_doms(Dom1,Dom2):-
  712  \+ non_disjoint_conds(Dom1,Dom2),
  713   disjoint_conds(Dom1,Dom2).
  714
  715disjoint_object_conds(Var1,Var2):- 
  716  obtain_object_conds(Var1,Var2,Dom1,Dom2),
  717  disjoint_conds(Dom1,Dom2).
  718
  719obtain_object_conds(Var1,Var2,Dom1,Dom2):- 
  720  obtain_conds(Var1,Dom1),obtain_conds(Var2,Dom2).
  721
  722obtain_conds(Var,Doms):- mtc_get_attr(Var,iza,Doms),!.
  723obtain_conds(Var,DomsO):- compound(Var),\+ is_fort(Var),functor(Var,_,A),arg(A,Var,Doms),
  724  (is_list(Doms)->DomsO=Doms; obtain_conds(Doms,DomsO)).
  725obtain_conds(Var,DomsO):- as_existential(Var,X),obtain_conds(X,DomsO).
  726% obtain_conds(_,[]).
  727
  728% conds may not be merged
  729disjoint_conds(Dom1,Dom2):- 
  730  member(Prop,Dom1), 
  731  rejects_cond(Prop,Dom2).
  732
  733% disjoint skolems
  734rejects_cond(aoc(SK,W1),Dom2):- !, memberchk(aoc(SK,W2),Dom2),'#\\='(W1,W2),!.
  735rejects_cond(male,Dom2):- !, memberchk(female,Dom2).
  736rejects_cond(_,_):- fail.
  737
  738% conds may not be merged
  739non_disjoint_conds(Dom1,Dom2):- 
  740  member(Prop,Dom1), 
  741  not_rejected_cond(Prop,Dom2).
  742
  743
  744aoc(_,_).
  745
  746% already same skolems
  747not_rejected_cond(aoc(SK,W1),Dom2):- !, memberchk(aoc(SK,W2),Dom2),'#='(W1 , W2),!.
  748not_rejected_cond(male,Dom2):- memberchk(female,Dom2).
  749
  750as_existential(In,Out):- is_existential(In),!,must(In=Out).
  751as_existential(In,Out):- var(In),!,decl_existential(In),must(In=Out).
  752% as_existential(In,Out):- strip_module(In,M,X), oo_deref(M,X,Out)->(X\==Out,is_existential(Out)),!.
  753as_existential(In,Out):- \+ is_fort(In),!,trace_or_throw(as_existential(In,Out)).
  754as_existential(In,Out):- nb_current_value(?('$fort2exist$'),In,Out),!.
  755as_existential(In,Out):- decl_existential(Out0),!,add_cond(Out0,aoc(isNamed,In)),!,
  756   must(nb_set_value(?('$fort2exist$'),In,Out0)),!,
  757   must(nb_current_value(?('$fort2exist$'),In,Out)),
  758   must(add_var_to_env(In,Out)).
  759
  760% :- ensure_loaded(library(multivar)).
  761l_xvarx(Var):- xvarx(Var).
  762
  763decl_existential(Var):- is_existential(Var),!.
  764decl_existential(Var):- var(Var),!,l_xvarx(Var),put_attr(Var,x,Var),mtc_put_iza(Var,[iza_id(Var)]).
  765decl_existential(Atomic):- trace_or_throw(\+ decl_existential(Atomic)).
  766
  767is_existential(Var):- var(Var),!,get_attr(Var,x,V),var(V).
  768is_existential(the(_)):-!.
  769
  770:- if(\+ current_predicate(attv_bind/2)).  771attv_bind(Var,Value):- Var=Value -> true; put_value(Var,Value).
  772:- endif.  773
  774x:attr_unify_hook(_Was,_Becoming):-!.
  775x:attr_unify_hook(Was,Becoming):- (attvar(Was),attvar(Becoming)) ->  attv_bind(Was,Becoming) ; true.
  776x:attribute_goals(Var) --> 
  777  ({is_existential(Var)} -> [decl_existential(Var)] ; []).
  778x:attr_portray_hook(Attr,Var):- one_portray_hook(Var,x(Var,Attr)).
  779
  780one_portray_hook(Var,Attr):-
  781  locally(set_prolog_flag(write_attributes,ignore),
  782  ((setup_call_cleanup(set_prolog_flag(write_attributes,ignore),
  783  ((subst(Attr,Var,SName,Disp),!,
  784  get_var_name(Var,Name),
  785   (atomic(Name)->SName=Name;SName=self),
  786   format('~p',[Disp]))),
  787   set_prolog_flag(write_attributes,portray))))).
  788
  789:- module_transparent(user:portray_var_hook/1).  790:- multifile(user:portray_var_hook/1).  791:- dynamic(user:portray_var_hook/1).  792
  793user:portray_var_hook(Var) :- 
  794 current_prolog_flag(write_attributes,portray),
  795 attvar(Var),
  796 get_attr(Var,x,Val),
  797  current_prolog_flag(write_attributes,Was),
  798  setup_call_cleanup(set_prolog_flag(write_attributes,ignore),
  799    writeq({exists(Var,Val)}),
  800    set_prolog_flag(write_attributes,Was)),!.
  801
  802
  803show_frame_and_goal(Prefix,Frame):- 
  804    prolog_frame_attribute(Frame,has_alternatives,Alt),
  805    prolog_frame_attribute(Frame,goal,Goal),
  806    prolog_frame_attribute(Frame,parent,Parent),
  807    prolog_frame_attribute(Parent,goal,PGoal),
  808    dmsg(frame(Prefix,Frame,Alt,Goal,PGoal)),!.
  809
  810clause_or_top(clause).
  811clause_or_top(top).
  812
  813% non-repeating var
  814xnr_var(Var):- 
  815  nonvar(Var) ->true; (get_attr(Var,xnr,_)->true;
  816   ((gensym(xnr_,Id),
  817   ((prolog_current_choice(clause_or_top,CP),prolog_choice_attribute(CP,frame,Frame))->true;prolog_current_frame(Frame)),
  818   % show_frame_and_goal(xnr_var,Frame),
  819   put_attr(Var,xnr,old_vals(Var,xnr_dif,Id,[],Frame,State)),
  820   l_xvarx(Var),
  821   nop(setup_call_cleanup(true,(true;(State=state(redoing))),setarg(1,State,exited)))))).
  822
  823xnr_var(Cmp,Var):- nonvar(Var) ->true; (get_attr(Var,xnr,_)->true;(gensym(xnr_,Id),put_attr(Var,xnr,old_vals(Var,Cmp,Id,[])))).
  824xnr:attr_unify_hook(AttValue,VarValue):-
  825  ((prolog_current_choice(clause_or_top,CP),prolog_choice_attribute(CP,frame,Frame))->true;prolog_current_frame(Frame)),
  826  AttValue=old_vals(Var,_Cmp,_Id,WazU,OldFrame,State),  
  827  nb_setarg(4,AttValue,[VarValue|WazU]), 
  828  once(has_redos(Frame,OldFrame,N)->true;N=0),
  829  (var(State)->(nb_setarg(6,AttValue,N));true),
  830  ((N==0) -> 
  831  ((arg(4,AttValue,List),show_frame_and_goal(has_redos(N),Frame),merge_compatibles(List,Set),!,
  832  (member(X,Set),attv_bind(Var,X))));(show_frame_and_goal(has_redos(N),Frame),fail)).
  833
  834
  835% :- ain(((((deduce_neg(P):- _), \+ (deduce_tru(P):-_))) ==> ((deduce_tru(P):- on_bind(P, \+ deduce_neg(P)))))).
  836
  837xnr(Goal):-term_variables(Goal,Vars),xnr(Vars,Goal).
  838
  839xnr([A],Goal):- xnr_var(A),!,Goal.
  840xnr([A|AA],Goal):- xnr_var(xnr_dif_l,[A|AA]),!,Goal.
  841xnr(_,Goal):-Goal,!.
  842
  843has_redos(CPFrame,OldCPFrame,0):- OldCPFrame==CPFrame,!.
  844  
  845has_redos(CPFrame,OldCPFrame,N):- 
  846  (prolog_frame_attribute(CPFrame,parent,Parent),has_redos(Parent,OldCPFrame,Nm1)),
  847  (prolog_frame_attribute(CPFrame,has_alternatives,true)-> ( N is Nm1 + 1) ; N is Nm1).
  848
  849
  850prolog_current_choice(Type,CPO):-prolog_current_choice(CP),prolog_current_choice(Type,CP,CPO).
  851prolog_current_choice(Type,CP,CPO):-prolog_choice_attribute(CP,type,WasType),(call(Type,WasType) -> CP=CPO ;
  852   (prolog_choice_attribute(CP,parent,CPP)->prolog_current_choice(Type,CPP,CPO);CPO=null)).
  853
  854   
  855/*
  856xnr:attr_unify_hook(AttValue,VarValue):- 
  857  AttValue=old_vals(_Var,_Cmp,_Id,WazU,_Frame,_CP),
  858  (WazU = [Old|Waz] -> 
  859   xnr_attr_unify_hook(AttValue,Old,Waz,VarValue) 
  860   ; nb_setarg(4,AttValue,[VarValue])).
  861*/
  862
  863xnr_attr_unify_hook(_,Old,Waz,VarValue):- member_eqz(VarValue,[Old|Waz]),!,fail.
  864xnr_attr_unify_hook(AttValue,Old,Waz,VarValue):- (is_existential(Old);is_existential(VarValue)),xnr_attr_unify_hook_ex(AttValue,Old,Waz,VarValue). 
  865xnr_attr_unify_hook(AttValue,Old,Waz,VarValue):- (var(Old);var(VarValue)),!,nb_setarg(4,AttValue,[VarValue,Old|Waz]).
  866xnr_attr_unify_hook(AttValue,Old,Waz,VarValue):- Old\=@=VarValue,!,nb_setarg(4,AttValue,[VarValue,Old|Waz]).
  867
  868xnr_attr_unify_hook_ex(AttValue,Old,Waz,VarValue):- ( \+ \+ (Old=VarValue) ),!,
  869   nb_setarg(4,AttValue,[VarValue,Old|Waz]),member(VarValue,[Old|Waz]).
  870   
  871xnr_attr_unify_hook_ex(AttValue,Old,Waz,VarValue):- nb_setarg(4,AttValue,[VarValue,Old|Waz]).
  872
  873
  874xnr:attribute_goals(_Var) --> !.
  875xnr:attribute_goals(Var) --> {fail},
  876  ({is_existential(Var)} -> [] ; [xnr_var(Var)]).
  877
  878xnr_dif(Old,VarValue):- Old\==VarValue,!,fail.
  879xnr_dif(Old,VarValue):- (is_existential(Old);is_existential(VarValue)),!,=(Old,VarValue),!,get_attrs(Old,Attrs),nb_put_attrs(Old,Attrs),!,fail.
  880xnr_dif(Old,VarValue):- (is_fort(Old);is_fort(VarValue)),!,\=(Old,VarValue).
  881xnr_dif(Old,VarValue):- (var(Old);var(VarValue)),!.
  882xnr_dif(Old,VarValue):- is_list(Old),!,xnr_dif_l(Old,VarValue).
  883xnr_dif(Old,VarValue):- nonvar(VarValue),Old\=@=VarValue.
  884
  885xnr_dif_l([A|Old],[B|VarValue]):- !,(xnr_dif(A,B);xnr_dif_l(Old,VarValue)).
  886xnr_dif_l(_,_).
  887
  888merge_compatibles([],[]):-!.
  889merge_compatibles([N],[N]):-!.
  890merge_compatibles([N|List],ListOut):-
  891   member(N,List) *-> merge_compatibles(List,ListOut);
  892      (merge_compatibles(List,ListMid),ListOut=[N|ListMid]).
  893  
  894
  895
  896existential_var(Var,_):- nonvar(Var),!.
  897existential_var(Var,_):- attvar(Var),!.
  898existential_var(Var,P):- put_attr(Var,x,P),!.
  899
  900
  901:- meta_predicate add_constraint_ex(*,*,*).  902 % add_constraint_ex(_Call,_P,_V):-!,fail.
  903add_constraint_ex(_,P,V):- \+ contains_var(V,P),!.
  904add_constraint_ex(_,P,V):- add_cond(V,P),!.
  905add_constraint_ex(Call,P,V):-freeze(V,call(Call,V,P)).
  906
  907
  908unify_two(AN,AttrX,V):- nonvar(V),!, (V='$VAR'(_)->true;throw(unify_two(AN,AttrX,V))).
  909unify_two(AN,AttrX,V):- get_attr(V,AN,OAttr),!,OAttr=@=AttrX,!. % ,show_call(OAttr=@=AttrX).
  910unify_two(AN,AttrX,V):- put_attr(V,AN,AttrX).
  911
  912
  913
  914add_cond_list_val(_,_,_,[]):- !.
  915add_cond_list_val(Pred1,_,X,[Y]):- atom(Pred1), X==Y -> true;P=..[Pred1,X,Y],add_cond(X,P). 
  916add_cond_list_val(Pred1,Pred,X,FreeVars):- list_to_set(FreeVars,FreeVarSet),FreeVars\==FreeVarSet,!,
  917  add_cond_list_val(Pred1,Pred,X,FreeVarSet).
  918add_cond_list_val(_Pred,Pred,X,FreeVars):- P=..[Pred,X,FreeVars],add_cond(X,P).
  919
  920
  921:- meta_predicate never_cond(?,*).  922never_cond(Var,nesc(b_d(_,nesc,poss), ~ P )):- !, ensure_cond(Var,poss(P)).
  923never_cond(Var,nesc(~ P )):- !, ensure_cond(Var,poss(P)).
  924never_cond(Var,(~ P )):- !, ensure_cond(Var,poss(P)).
  925never_cond(NonVar,Closure):- nonvar(NonVar),!, \+ call_e_tru(NonVar,Closure).
  926never_cond(_Var,Closure):- ground(Closure),!, call_u(~Closure).
  927never_cond(Var,Closure):- attvar(Var),!,add_cond(Var,~Closure).
  928%never_cond(Var,Closure):- add_cond(Var,Closure).
  929
  930
  931private_cond(iza_id(_)).
  932local_cond(iza_id(_)).
  933
  934not_nameOf(Ex,V):- \+ nesc(isNamed(Ex,V)).
  935
  936var_plain(Var):-var(Var), \+ attvar(Var).
  937
  938:- module_transparent(isNamed_impl/2).  939:- module_transparent(isNamed_const_var/2).  940:- module_transparent(isNamed_var/2).  941
  942isNamed_impl(Var,Str):- Var=@=Str,!.
  943isNamed_impl(Var,Str):- atom(Str),!,as_existential(Str,SVar),!,SVar=Var.
  944isNamed_impl(Var,Str):- var(Var),!,isNamed_var(Var,Str).
  945isNamed_impl(Var,Str):- atom(Var),!,as_existential(Var,X),!,isNamed_var(X,Str).
  946isNamed_impl(Var,Str):- !, Var=Str.
  947isNamed_impl(Var,Str):- isNamed_const_var(Var,Str).
  948
  949
  950isNamed_const_var(Var,Str):- compound(Str),!,proven_tru(isNamed(Var,Str)).
  951isNamed_const_var(Var,Str):- number(Var),!,number_string(Var,Str).
  952isNamed_const_var(Var,Str):- atomic(Var),!,text_to_string(Var,Str).
  953isNamed_const_var(Var,Str):- term_string(Var,Str).
  954
  955
  956  
  957
  958isNamed_var(Var,Str):- var_plain(Var),var_plain(Str),!,strip_module(_,M,_),
  959 my_when((nonvar(Str);nonvar(Var);?=(Var,Str)),M:isNamed(Var,Str)).
  960isNamed_var(Var,Str):- nonvar(Str),(has_cond(Var,isNamed(Var,V0));has_cond(Var,aoc(isNamed,V0))),!,text_to_string(V0,Str).
  961isNamed_var(Var,Str):- nrlc(proven_tru(isNamed(Var,Str))).
  962isNamed_var(Var,Str):- nonvar(Str),!,add_cond(Var,isNamed(Var,Str)),add_cond(Var,aoc(isNamed,Str)),!,add_var_to_env(Str,Var).
  963isNamed_var(Var,Str):- var(Str),(has_cond(Var,isNamed(Var,Str));has_cond(Var,aoc(isNamed,Str))),!,
  964   (nonvar(Str)->add_var_to_env(Str,Var);true).
  965
  966% isNamed_impl(Var,Str):- proven_tru(isNamed(Var,Str)).
  967% isNamed_impl(Var,Str):- var(Str),!,add_cond(Var,isNamed(Var,Str)),!.
  968
  969:- export(isNamed_impl/2).  970:- baseKB:import(isNamed_impl/2).  971:- module_transparent(baseKB:isNamed/2).  972baseKB:isNamed(X,Y):- strip_module(_,M,_),M:isNamed_impl(X,Y).
  973
  974%:- ain((mtHybrid(Mt)==> {kb_local(Mt:isNamed/2)})).
  975
  976nrlc(G):- no_repeats(loop_check(G,(((dmsg(warn(looped(G)))),fail)))).
  977
  978
  979% Translate attributes from this module to residual goals
  980iza:attribute_goals(X) -->
  981      { mtc_get_attr(X, iza, List) },!,
  982      [add_cond(X, List)].
 add_cond(?Var, ?HintE) is semidet
Add Iza.
  988as_constraint_for(Arg,isa(AArg,FA),FA):- \+ kif_option_value(iza_atoms,false), atom(FA),AArg==Arg,!.
  989as_constraint_for(Arg,ISA,FA):- \+ kif_option_value(iza_atoms,false), compound(ISA), ISA=..[FA,AArg],AArg==Arg,!.
  990as_constraint_for(Arg,props(AArg,FA),props(FA)):- \+ kif_option_value(iza_atoms,false), atom(FA),AArg==Arg,!.
  991as_constraint_for(Arg,PROP,props(ASPROP)):- \+ kif_option_value(iza_atoms,false), compound(PROP), PROP=..[FA,AArg|Rest],AArg==Arg,ASPROP=..[FA|Rest].
  992as_constraint_for(_,FA,FA).
  993
  994
  995add_cond_rev(Prop,Var):- add_cond(Var,Prop).
  996
  997:- meta_predicate ensure_cond(?,*).  998:- module_transparent(ensure_cond/1).  999ensure_cond(Var,Closure):-!, add_cond(Var,Closure).
 1000ensure_cond(NonVar,Closure):- nonvar(NonVar),!,call_e_tru(NonVar,Closure).
 1001ensure_cond(Var,Closure):- is_existential(Var),!,show_failure(add_cond(Var,Closure)).
 1002ensure_cond(Var,Closure):- attvar(Var),!,show_failure(add_cond(Var,Closure)).
 1003ensure_cond(Var,Closure):- as_existential(Var,VarX),must(add_cond(VarX,Closure)),!.
 1004
 1005add_cond(Var,Prop):- is_list(Prop),!,as_existential(Var,VarX),obtain_conds(VarX,Dom1),!,maplist(add_cond3(VarX,Dom1),Prop).
 1006add_cond(Var,Prop):- as_existential(Var,VarX),obtain_conds(VarX,Dom1),add_cond3(VarX,Dom1,Prop).
 1007
 1008add_cond1(Var,Prop):- obtain_conds(Var,Dom1),add_cond3(Var,Dom1,Prop).
 1009
 1010add_cond3(Var,Dom1,Prop):- as_constraint_for(Var,Prop,Constraint),
 1011   show_failure(( \+ rejects_cond(Constraint,Dom1))),
 1012   ord_union(Dom1, [Constraint], NewDomain),
 1013   mtc_put_attr(Var,iza,NewDomain).
 1014
 1015
 1016:- meta_predicate map_one_or_list(1,?). 1017
 1018
 1019map_one_or_list(Call2,ArgOrL):- is_list(ArgOrL)->maplist(Call2,ArgOrL);call(Call2,ArgOrL).
 1020
 1021has_cond(Var,Prop):- obtain_conds(Var,Doms),map_one_or_list(has_cond(Doms,Var),Prop).
 1022has_cond(Doms,Var,Prop):- as_constraint_for(Var,Prop,C),member(C,Doms).
 1023
 1024rem_cond(Var,Prop):- obtain_conds(Var,Doms),map_one_or_list(rem_cond(Doms,Var),Prop).
 1025rem_cond(Doms,Var,Prop):- as_constraint_for(Var,Prop,C),select(C,Doms,NewDoms),mtc_put_attr(Var,iza,NewDoms).
 1026
 1027not_has_cond(Var,Prop):- obtain_conds(Var,Doms),map_one_or_list(not_has_cond(Doms,Var),Prop).
 1028not_has_cond(Doms,Var,Prop):- \+ has_cond(Doms,Var,Prop).
 chk_cond(?E, ?Cs) is semidet
Isac Checking.
 1037:- module_transparent(chk_cond/2). 1038chk_cond(_,_):- local_override(no_kif_var_coroutines,G),!,call(G).
 1039chk_cond(E,Cs):- once(call_cond(E,Cs)).
 1040
 1041
 1042:- module_transparent(call_cond/2). 1043:- module_transparent(call_cond_x/2).
 call_cond(?VALUE1, :TermARG2) is semidet
Isac Gen.
 1048call_cond(Var):- as_existential(Var,X),obtain_conds(X,Conds),call_cond_x(X,Conds).
 1049call_cond(Var,Conds):- is_fort(Var),!,as_existential(Var,X),call_cond_x(X,Conds).
 1050call_cond(Var,Conds):- call_cond_x(Var,Conds).
 1051
 1052call_cond_x(Y, [H|List]):- ground(Y),!,cond_call0(Y,H),!,cond_call00(Y, List).
 1053call_cond_x(Y, [H|List]):- !,maplist(cond_call0(Y),[H|List]).
 1054call_cond_x(_, _).
 1055
 1056cond_call00(Y, [H|List]):-!,cond_call0(Y,H),!,cond_call00(Y, List).
 1057cond_call00(_, _).
 1058
 1059cond_call0(Y,H):- atom(H),!,nesc(isa(Y,H)).
 1060cond_call0(_,dif_objs(X,Y)):-!,X\==Y.
 1061cond_call0(Y,props(H)):- ereq(props(Y,H)).
 1062cond_call0(Y,H):- arg(_,H,E),Y==E,!,call_u(H).
 1063cond_call0(_,H):- call_u(H).
 1064
 1065                     
 1066
 1067/*
 1068enforce_fa_unify_hook([Goal|ArgIsas],Value):- !,
 1069  enforce_fa_call(Goal,Value),
 1070  enforce_fa_unify_hook(ArgIsas,Value).
 1071enforce_fa_unify_hook(_,_).
 1072
 1073enforce_fa_call(Goal,Value):- atom(Goal),!,call(Goal,Value).
 1074enforce_fa_call(Goal,Value):- arg(_,Goal,Var),Var==Value,!,call(Goal).
 1075enforce_fa_call(Goal,Value):- prepend_arg(Goal,Value,GVoal),!,call(GVoal).
 1076
 1077prepend_arg(M:Goal,Value,M:GVoal):- !, prepend_arg(Goal,Value,GVoal).
 1078prepend_arg(Goal,Value,GVoal):- Goal=..[F|ARGS],GVoal=..[F,Value|ARGS].
 1079*/
 1080
 1081/*
 1082
 1083 G=(loves(X,Y),~knows(Y,tHuman(X))),args_enforce(G,Out),maplist(call,Out).
 1084
 1085*/
 attribs_to_atoms(?ListA, ?List) is semidet
Attribs Converted To Atoms.
 1092attribs_to_atoms(ListA,List):-map_subterms(attribs_to_atoms0,ListA,List).
 map_subterms(:PRED2Pred, ?I, ?O) is semidet
Map Subterms.
 1101map_subterms(Pred,I,O):-is_list(I),!,maplist(map_subterms(Pred),I,O).
 1102map_subterms(Pred,I,O):-call(Pred,I,O),!.
 1103map_subterms(Pred,I,O):-compound(I),!,I=..IL,maplist(map_subterms(Pred),IL,OL),O=..OL.
 1104map_subterms(_Pred,IO,IO).
 condz_to_isa(:TermAA, :TermAB) is semidet
iza Converted To (iprops/2).
 1113condz_to_isa(Iza,ftTerm):-var(Iza),!.
 1114condz_to_isa((A,B),isAnd(ListO)):-!,conjuncts_to_list((A,B),List),list_to_set(List,Set),min_cond_l(Set,ListO).
 1115condz_to_isa((A;B),isOr(Set)):-!,conjuncts_to_list((A,B),List),list_to_set(List,Set).
 1116condz_to_isa(AA,AB):-must(AA=AB).
 attribs_to_atoms0(?Var, ?Isa) is semidet
Attribs Converted To Atoms Primary Helper.
 1125attribs_to_atoms0(Var,Isa):-mtc_get_attr(Var,iza,Iza),!,must(condz_to_isa(Iza,Isa)).
 1126attribs_to_atoms0(O,O):- \+ (compound(O)).
 min_cond_l(?List, ?ListO) is semidet
min (sub_super/2) (List version).
 1133min_cond_l(List,ListO):-isa_pred_l(lambda(Y,X,sub_super(X,Y)),List,ListO).
 max_cond_l(?List, ?ListO) is semidet
max (sub_super/2) (List version).
 1141max_cond_l(List,ListO):-isa_pred_l(sub_super,List,ListO).
 isa_pred_l(:PRED2Pred, ?List, ?ListO) is semidet
(iprops/2) Predicate (List version).
 1149isa_pred_l(Pred,List,ListO):-isa_pred_l(Pred,List,List,ListO).
 isa_pred_l(:PRED2Pred, ?UPARAM2, ?List, ?UPARAM4) is semidet
(iprops/2) Predicate (List version).
 1158isa_pred_l(_Pred,[],_List,[]).
 1159isa_pred_l(Pred,[X|L],List,O):-member(Y,List),X\=Y,call_u(call(Pred,X,Y)),!,isa_pred_l(Pred,L,List,O).
 1160isa_pred_l(Pred,[X|L],List,[X|O]):-isa_pred_l(Pred,L,List,O).
 min_cond(:TermHintA, ?HintE, ?HintE) is semidet
min (sub_super/2).
 1169min_cond([H],In,Out):- !, min_cond0(H,In,Out).
 1170min_cond([H|T],In,Out):- !, min_cond0(H,In,Mid),min_cond(T,Mid,Out).
 1171min_cond(E,In,Out):- min_cond0(E,In,Out).
 1172
 1173min_cond0(HintA,[],[HintA]).
 1174min_cond0(HintA,[HintB|HintL],[HintB|HintL]):- HintA==HintB,!.
 1175min_cond0(HintA,[HintB|HintL],[HintA,HintB|HintL]):- functor(HintA,_,A),functor(HintB,_,B),B>A,!.
 1176min_cond0(HintA,[HintB|HintL],[HintA|HintL]):- sub_super(HintA,HintB),!.
 1177min_cond0(HintA,[HintB|HintL],[HintB|HintL]):- sub_super(HintB,HintA),!.
 1178min_cond0(HintA,[HintB|HintL],[HintB|HintS]):- !,min_cond0(HintA,HintL,HintS).
 1179
 1180
 1181
 1182sub_super(Col1,Col2):- tCol(Col1),!,genls(Col1,Col2).
 max_cond(:TermHintA, ?HintE, ?HintE) is semidet
max (sub_super/2).
 1188max_cond([H],In,Out):- !, max_cond0(H,In,Out).
 1189max_cond([H|T],In,Out):- !, max_cond0(H,In,Mid),max_cond(T,Mid,Out).
 1190max_cond(E,In,Out):- max_cond0(E,In,Out).
 1191
 1192max_cond0(HintA,[],[HintA]).
 1193max_cond0(HintA,[HintB|HintL],[HintB|HintL]):- HintA==HintB,!.
 1194max_cond0(HintA,[HintB|HintL],[HintA,HintB|HintL]):- functor(HintA,_,A),functor(HintB,_,B),B>A,!.
 1195max_cond0(HintA,[HintB|HintL],[HintA|HintL]):- sub_super(HintB,HintA),!.
 1196max_cond0(HintA,[HintB|HintL],[HintB|HintL]):- sub_super(HintA,HintB),!.
 1197max_cond0(HintA,[HintB|HintL],[HintB|HintS]):- !,max_cond0(HintA,HintL,HintS).
 1198
 1199
 1200
 1201
 1202
 1203:- style_check(-singleton).
 unrelax(?X) is semidet
Domain Labeling (residuals).
 1212unrelax(X):-copy_term(X,X,Gs),maplist(iz_member,Gs).
 iz_member(:GoalG) is semidet
Domain Member.
 1221iz_member(iz(X,List)):-!,member(X,List).
 1222iz_member(G):-G.
 1223
 1224
 1225:- style_check(-singleton).
 attempt_attribute_args(?AndOr, ?Hint, :TermVar) is semidet
Attempt Attribute Arguments.
 1232attempt_attribute_args(_AndOr,Hint,Var):- var(Var),add_cond(Var,Hint),!.
 1233attempt_attribute_args(_AndOr,_Hint,Grnd):-ground(Grnd),!.
 1234attempt_attribute_args(_AndOr,_Hint,Term):- \+ (compound(Term)),!.
 1235attempt_attribute_args(AndOr,Hint,+(A)):-!,attempt_attribute_args(AndOr,Hint,A).
 1236attempt_attribute_args(AndOr,Hint,-(A)):-!,attempt_attribute_args(AndOr,Hint,A).
 1237attempt_attribute_args(AndOr,Hint,?(A)):-!,attempt_attribute_args(AndOr,Hint,A).
 1238attempt_attribute_args(AndOr,Hint,(A,B)):-!,attempt_attribute_args(AndOr,Hint,A),attempt_attribute_args(AndOr,Hint,B).
 1239attempt_attribute_args(AndOr,Hint,[A|B]):-!,attempt_attribute_args(AndOr,Hint,A),attempt_attribute_args(AndOr,Hint,B).
 1240attempt_attribute_args(AndOr,Hint,(A;B)):-!,attempt_attribute_args(';'(AndOr),Hint,A),attempt_attribute_args(';'(AndOr),Hint,B).
 1241attempt_attribute_args(_AndOr,_Hint,Term):- use_was_isa(Term,I,C), add_cond(I,C).
 1242attempt_attribute_args(AndOr,_Hint,Term):- Term=..[F,A],tCol(F),!,attempt_attribute_args(AndOr,F,A).
 1243attempt_attribute_args(AndOr,Hint,Term):- Term=..[F|ARGS],!,attempt_attribute_args(AndOr,Hint,F,1,ARGS).
 attempt_attribute_args(?AndOr, ?Hint, ?F, ?N, :TermARG5) is semidet
Attempt Attribute Arguments.
 1252attempt_attribute_args(_AndOr,_Hint,_F,_N,[]):-!.
 1253attempt_attribute_args(AndOr,_Hint,t,1,[A]):-attempt_attribute_args(AndOr,callable,A).
 1254attempt_attribute_args(AndOr,Hint,t,N,[A|ARGS]):-atom(A),!,attempt_attribute_args(AndOr,Hint,A,N,ARGS).
 1255attempt_attribute_args(_AndOr,_Hint,t,_N,[A|_ARGS]):- \+ (atom(A)),!.
 1256attempt_attribute_args(AndOr,Hint,F,N,[A|ARGS]):-attempt_attribute_one_arg(Hint,F,N,A),N2 is N+1,attempt_attribute_args(AndOr,Hint,F,N2,ARGS).
 attempt_attribute_one_arg(?Hint, ?F, ?N, ?A) is semidet
Attempt Attribute One Argument.
 1265attempt_attribute_one_arg(_Hint,F,N,A):-call_u(argIsa(F,N,Type)),Type\=ftTerm, \+ (compound(Type)),!,attempt_attribute_args(and,Type,A).
 1266attempt_attribute_one_arg(_Hint,F,N,A):-call_u(argQuotedIsa(F,N,Type)),Type\=ftTerm, \+ (compound(Type)),!,attempt_attribute_args(and,Type,A).
 1267attempt_attribute_one_arg(_Hint,F,N,A):-call_u(argIsa(F,N,Type)),Type\=ftTerm,!,attempt_attribute_args(and,Type,A).
 1268attempt_attribute_one_arg(_Hint,F,N,A):-attempt_attribute_args(and,argi(F,N),A).
 1269
 1270
 1271
 1272:- was_export((samef/2,same/2)).
 same(?X, ?Y) is semidet
Same.
 1280same(X,Y):- samef(X,Y),!.
 1281same(X,Y):- compound(X),arg(1,X,XX)->same(XX,Y),!.
 1282same(Y,X):- compound(X),arg(1,X,XX),!,same(XX,Y).
 samef(?X, ?Y) is semidet
Samef.
 1291samef(X,Y):- quietly(((to_functor(X,XF),to_functor(Y,YF),(XF=YF->true;string_equal_ci(XF,YF))))).
 to_functor(?A, ?O) is semidet
Converted To Functor.
 1300to_functor(A,O):-is_ftVar(A),!,A=O.
 1301to_functor(A,O):-compound(A),get_functor(A,O),!. % ,to_functor(F,O).
 1302to_functor(A,A).
 1303
 1304:- was_export(arg_to_var/3).
 arg_to_var(?Type, ?String, ?Var) is semidet
Argument Converted To Variable.
 1312arg_to_var(_Type,_String,_Var).
 1313
 1314:- was_export(same_arg/3).
 same_arg(?How, ?X, ?Y) is semidet
Same Argument.
 1323same_arg(_How,X,Y):-var(X),var(Y),!,X=Y.
 1324same_arg(equals,X,Y):-!,equals_call(X,Y).
 1325same_arg(tCol(_Type),X,Y):-!, unify_with_occurs_check(X,Y).
 1326
 1327same_arg(ftText,X,Y):-(var(X);var(Y)),!,X=Y.
 1328same_arg(ftText,X,Y):-!, string_equal_ci(X,Y).
 1329
 1330same_arg(same_or(equals),X,Y):- same_arg(equals,X,Y).
 1331same_arg(same_or(sub_super),X,Y):- same_arg(equals,X,Y).
 1332same_arg(same_or(sub_super),Sub,Sup):- holds_t(sub_super,Sub,Sup),!.
 1333same_arg(same_or(isa),X,Y):- same_arg(equals,X,Y).
 1334same_arg(same_or(isa),I,Sup):- !, holds_t(Sup,I),!.
 1335
 1336same_arg(same_or(_Pred),X,Y):- same_arg(equals,X,Y).
 1337same_arg(same_or(Pred),I,Sup):- holds_t(Pred,I,Sup),!.
 1338
 1339% same_arg(I,X):- promp_yn('~nSame Objects: ~q== ~q ?',[I,X]).
 promp_yn(?Fmt, ?A) is semidet
Promp Yn.
 1347promp_yn(Fmt,A):- format(Fmt,A),get_single_char(C),C=121.
 1348
 1349
 1350
 1351% :-swi_module(iz, [ iz/2  ]). % Var, ?Domain
 1352:- use_module(library(ordsets)).
 iz(?X, ?Dom) is semidet
Domain.
 1358:- was_export(iz/2). 1359
 1360iz(X, Dom) :- var(Dom), !, mtc_get_attr(X, iz, Dom).
 1361% iz(X, Dom) :- var(Dom), !, (mtc_get_attr(X, iz, Dom)->true;mtc_put_attr(X, iz, [iziz(Dom)])).
 1362iz(X, List) :- 
 1363      listify(List,List0),
 1364      list_to_ord_set(List0, Domain),
 1365      mtc_put_attr(Y, iz, Domain),
 1366      X = Y.
 1367
 1368:- was_export(extend_iz_member/2).
 extend_iz_member(?X, ?DomL) is semidet
Extend Domain.
 1376extend_iz_member(X, DomL):- init_iz(X, Dom2), ord_union(Dom2, DomL, NewDomain),mtc_put_attr( X, iz, NewDomain ).
 1377
 1378:- was_export(extend_iz/2).
 extend_iz(?X, ?DomE) is semidet
Extend Domain.
 1386extend_iz(X, DomE):-  init_iz(X, Dom2),ord_add_element(Dom2, DomE, NewDomain),mtc_put_attr( X, iz, NewDomain ).
 1387
 1388:- was_export(init_iz/2).
 init_iz(?X, ?Dom) is semidet
Init Domain.
 1396init_iz(X,Dom):-mtc_get_attr(X, iz, Dom),!.
 1397init_iz(X,Dom):-Dom =[_], mtc_put_attr(X, iz, Dom),!.
 1398
 1399% An attributed variable with attribute value Domain has been
 1400% assigned the value Y
 1401
 1402iz:attr_unify_hook([Y], Value) :-  same(Y , Value),!.
 1403iz:attr_unify_hook(Domain, Y) :-
 1404   ( mtc_get_attr(Y, iz, Dom2)
 1405   -> ord_intersection(Domain, Dom2, NewDomain),
 1406         ( NewDomain == []
 1407         -> fail
 1408         ; NewDomain = [Value]
 1409          -> same(Y , Value)
 1410             ; mtc_put_attr(Y, iz, NewDomain)
 1411           )
 1412   ; var(Y)
 1413   -> mtc_put_attr( Y, iz, Domain )
 1414   ; (\+ \+ (cmp_memberchk_0(Y, Domain)))
 1415).
 1416
 1417
 1418
 1419% Translate attributes from this module to residual goals
 1420iz:attribute_goals(X) --> { mtc_get_attr(X, iz, List) },!,[iz(X, List)].
 1421
 1422
 1423
 1424%iz:attr_portray_hook(Val, _) :- write('iz:'), write(Val),!.
 1425
 1426%iza:attr_portray_hook(Val, _) :- write('iza:'), write(Val),!.
 cmp_memberchk_0(?X, ?Y) is semidet
Cmp Memberchk.
 1433cmp_memberchk_0(X,Y):-numbervars(X,0,_,[attvars(skip)]),member(X,Y),!.
 cmp_memberchk_00(?Item, :TermX1) is semidet
Cmp Memberchk Primary Helper.
 1441cmp_memberchk_00(Item, [X1,X2,X3,X4|Xs]) :- !,
 1442	compare(R4, Item, X4),
 1443	(   R4 = (>) -> cmp_memberchk_00(Item, Xs)
 1444	;   R4 = (<) ->
 1445	    compare(R2, Item, X2),
 1446	    (   R2 = (>) -> Item = X3
 1447	    ;   R2 = (<) -> Item = X1
 1448	    ;/* R2 = (=),   Item = X2 */ true
 1449	    )
 1450	;/* R4 = (=) */ true
 1451	).
 1452cmp_memberchk_00(Item, [X1,X2|Xs]) :- !,
 1453	compare(R2, Item, X2),
 1454	(   R2 = (>) -> cmp_memberchk_00(Item, Xs)
 1455	;   R2 = (<) -> Item = X1
 1456	;/* R2 = (=) */ true
 1457	).
 1458cmp_memberchk_00(Item, [X1]) :-
 1459	Item = X1.
 1460
 1461
 1462:- meta_predicate(call_engine_m(?,0,-,-)). 1463call_engine_m(Templ,Goal,Engine,Det):-
 1464  call_engine_start_m(Templ,Goal,Engine),
 1465  call_engine_next_m(Engine,Templ,Det).
 1466
 1467:- meta_predicate(call_engine_start_m(?,0,-)). 1468call_engine_start_m(Templ,Goal,Engine):-
 1469   engine_create(Templ-TF0,(Goal,deterministic(TF0)),Engine).
 1470
 1471call_engine_next_m(Engine,Templ,Det):-
 1472   repeat,
 1473    engine_next(Engine,Templ-Det),
 1474     (Det==true->!;true).
 1475
 1476metapred_plus(_,_):-!.
 1477metapred_plus(Cmp,Plus):-
 1478  (\+ compound(Cmp) -> S=0 ; compound_name_arity(Cmp,F,S)),
 1479  A is S + Plus,
 1480  current_predicate(F/A),!.
 1481metapred_plus(_,_).
 1482
 1483not_dif_objs(A,B):- \+ dif_objs(A,B).
 1484
 1485:- meta_predicate(pred1_to_unique_pairs(1,-,-)). 1486pred1_to_unique_pairs(Pred1,Obj1,Obj2):-
 1487  sanity(assertion(metapred_plus(Pred1,1))),
 1488  lazy_findall(Elem,call(Pred1,Elem),List),
 1489  list_to_unique_pairs(List,Obj1,Obj2).
 1490
 1491:- meta_predicate(pred1_to_unique_pairs_confirmed(1,-,-)). 1492pred1_to_unique_pairs_confirmed(Pred1,Obj1,Obj2):-
 1493   Tracker = '$t'([]),
 1494   Same2 = not_dif_objs,
 1495   pred1_to_unique_pairs(Pred1,ObjA,ObjB),
 1496   different_pairs(Same2,Tracker,ObjA,ObjB,Obj1,Obj2).
 1497
 1498list_to_unique_pairs(List,Obj1,Obj2):-
 1499  append(_Left,[Obj1|Rest],List),member(Obj2,Rest).
 1500
 1501:- meta_predicate different_pairs(2,+,?,?,?,?). 1502different_pairs(Same2,Tracker,ObjA,ObjB,Obj1,Obj2):- 
 1503 Test = p(TObj1,TObj2),
 1504 zotrace(sanity((must_be(compound,Tracker),
 1505    assertion(metapred_plus(Pred2InstsDiff,2))))),
 1506 zotrace((\+ call(Same2, ObjA, ObjA))),
 1507 zotrace((( ObjA @> ObjB -> (ObjA = Obj1, ObjB = Obj2) ; (ObjA = Obj2, ObjB = Obj1)))),
 1508 must(arg(1,Tracker,PrevPairs)),
 1509 (((member(Test,PrevPairs),call(Same2,Obj1,TObj1),call(Same2,Obj2,TObj2)))-> fail ; true),
 1510 must(nb_setarg(1,Tracker,[p(Obj1,Obj2)|PrevPairs])).

The difv/2 constraint

*/

 difv(+Term1, +Term2) is semidet
Constraint that expresses that Term1 and Term2 never become variant (=@@=/2). Fails if `Term1 =@@= Term2`. Succeeds if Term1 can never become identical to Term2. In other cases the predicate succeeds after attaching constraints to the relevant parts of Term1 and Term2 that prevent the two terms to become identical.
 1526=@@=(X,Y):-!, ==(X,Y).
 1527% =@@=(X,Y):- (attvar(X);attvar(Y))-> X==Y ;((var(X);var(Y))-> X==Y ; X=@=Y).
 1528
 1529:- op(700,xfx,user:('=@@=')). 1530
 1531% difv(_X,_Y):-!.
 1532difv(X,Y) :-
 1533    \+ (X =@@= Y),
 1534    difv_c_c(X,Y,_).
 1535
 1536difv_unifiable(X, Y, Us) :-
 1537    (    current_prolog_flag(occurs_check, error) ->
 1538         catch(unifiable(X,Y,Us), error(occurs_check(_,_),_), false)
 1539    ;    unifiable(X, Y, Us)
 1540    ).
 1541
 1542difv_c_c(X,Y,OrNode) :-
 1543    (       difv_unifiable(X, Y, Unifier) ->
 1544            ( Unifier == [] ->
 1545                    or_one_failv(OrNode)
 1546            ;
 1547                    difv_c_c_l(Unifier,OrNode)
 1548            )
 1549    ;
 1550            or_succeedv(OrNode)
 1551    ).
 1552
 1553
 1554difv_c_c_l(Unifier,OrNode) :-
 1555    length(Unifier,N),
 1556    extend_ornodevv(OrNode,N,List,Tail),
 1557    difv_c_c_l_aux(Unifier,OrNode,List,Tail).
 1558
 1559extend_ornodevv(OrNode,N,List,Vars) :-
 1560    ( get_attr(OrNode,difv,Attr) ->
 1561            Attr = nodev(M,Vars),
 1562            O is N + M - 1
 1563    ;
 1564            O = N,
 1565            Vars = []
 1566    ),
 1567    put_attr(OrNode,difv,nodev(O,List)).
 1568
 1569difv_c_c_l_aux([],_,List,List).
 1570difv_c_c_l_aux([X=Y|Unifier],OrNode,List,Tail) :-
 1571    List = [X=Y|Rest],
 1572    add_ornodevv(X,Y,OrNode),
 1573    difv_c_c_l_aux(Unifier,OrNode,Rest,Tail).
 1574
 1575add_ornodevv(X,Y,OrNode) :-
 1576    add_ornodev_var1(X,Y,OrNode),
 1577    ( var(Y) ->
 1578            add_ornodev_var2(X,Y,OrNode)
 1579    ;
 1580            true
 1581    ).
 1582
 1583add_ornodev_var1(X,Y,OrNode) :-
 1584    ( get_attr(X,difv,Attr) ->
 1585            Attr = vardifv(V1,V2),
 1586            put_attr(X,difv,vardifv([OrNode-Y|V1],V2))
 1587    ;
 1588            put_attr(X,difv,vardifv([OrNode-Y],[]))
 1589    ).
 1590
 1591add_ornodev_var2(X,Y,OrNode) :-
 1592    ( get_attr(Y,difv,Attr) ->
 1593            Attr = vardifv(V1,V2),
 1594            put_attr(Y,difv,vardifv(V1,[OrNode-X|V2]))
 1595    ;
 1596            put_attr(Y,difv,vardifv([],[OrNode-X]))
 1597    ).
 1598
 1599difv:attr_unify_hook(vardifv(V1,V2),Other) :-
 1600    ( var(Other) ->
 1601            reverse_lookupsv(V1,Other,OrNodes1,NV1),
 1602            or_one_failvsv(OrNodes1),
 1603            get_attr(Other,difv,OAttr),
 1604            OAttr = vardifv(OV1,OV2),
 1605            reverse_lookupsv(OV1,Other,OrNodes2,NOV1),
 1606            or_one_failvsv(OrNodes2),
 1607            remove_obsoletev(V2,Other,NV2),
 1608            remove_obsoletev(OV2,Other,NOV2),
 1609            append(NV1,NOV1,CV1),
 1610            append(NV2,NOV2,CV2),
 1611            ( CV1 == [], CV2 == [] ->
 1612                    del_attr(Other,difv)
 1613            ;
 1614                    put_attr(Other,difv,vardifv(CV1,CV2))
 1615            )
 1616    ;
 1617            verify_compoundsv(V1,Other),
 1618            verify_compoundsv(V2,Other)
 1619    ).
 1620
 1621remove_obsoletev([], _, []).
 1622remove_obsoletev([N-Y|T], X, L) :-
 1623    (   Y=@@=X ->
 1624        remove_obsoletev(T, X, L)
 1625    ;   L=[N-Y|RT],
 1626        remove_obsoletev(T, X, RT)
 1627    ).
 1628
 1629reverse_lookupsv([],_,[],[]).
 1630reverse_lookupsv([N-X|NXs],Value,Nodes,Rest) :-
 1631    ( X =@@= Value ->
 1632            Nodes = [N|RNodes],
 1633            Rest = RRest
 1634    ;
 1635            Nodes = RNodes,
 1636            Rest = [N-X|RRest]
 1637    ),
 1638    reverse_lookupsv(NXs,Value,RNodes,RRest).
 1639
 1640verify_compoundsv([],_).
 1641verify_compoundsv([OrNode-Y|Rest],X) :-
 1642    ( var(Y) ->
 1643            true
 1644    ; OrNode == (-) ->
 1645            true
 1646    ;
 1647            difv_c_c(X,Y,OrNode)
 1648    ),
 1649    verify_compoundsv(Rest,X).
 1650
 1651%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 1652or_succeedv(OrNode) :-
 1653    ( attvar(OrNode) ->
 1654            get_attr(OrNode,difv,Attr),
 1655            Attr = nodev(_Counter,Pairs),
 1656            del_attr(OrNode,difv),
 1657            OrNode = (-),
 1658            del_or_difv(Pairs)
 1659    ;
 1660            true
 1661    ).
 1662
 1663or_one_failvsv([]).
 1664or_one_failvsv([N|Ns]) :-
 1665    or_one_failv(N),
 1666    or_one_failvsv(Ns).
 1667
 1668or_one_failv(OrNode) :-
 1669    ( attvar(OrNode) ->
 1670            get_attr(OrNode,difv,Attr),
 1671            Attr = nodev(Counter,Pairs),
 1672            NCounter is Counter - 1,
 1673            ( NCounter == 0 ->
 1674                    fail
 1675            ;
 1676                    put_attr(OrNode,difv,nodev(NCounter,Pairs))
 1677            )
 1678    ;
 1679            fail
 1680    ).
 1681
 1682del_or_difv([]).
 1683del_or_difv([X=Y|Xs]) :-
 1684    cleanup_dead_nodesv(X),
 1685    cleanup_dead_nodesv(Y),
 1686    del_or_difv(Xs).
 1687
 1688cleanup_dead_nodesv(X) :-
 1689    ( attvar(X) ->
 1690            get_attr(X,difv,Attr),
 1691            Attr = vardifv(V1,V2),
 1692            filter_dead_orsv(V1,NV1),
 1693            filter_dead_orsv(V2,NV2),
 1694            ( NV1 == [], NV2 == [] ->
 1695                    del_attr(X,difv)
 1696            ;
 1697                    put_attr(X,difv,vardifv(NV1,NV2))
 1698            )
 1699    ;
 1700            true
 1701    ).
 1702
 1703filter_dead_orsv([],[]).
 1704filter_dead_orsv([Or-Y|Rest],List) :-
 1705    ( var(Or) ->
 1706            List = [Or-Y|NRest]
 1707    ;
 1708            List = NRest
 1709    ),
 1710    filter_dead_orsv(Rest,NRest).
 1711
 1712/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 1713   The attribute of a variable X is vardifv/2. The first argument is a
 1714   list of pairs. The first component of each pair is an OrNode. The
 1715   attribute of each OrNode is node/2. The second argument of node/2
 1716   is a list of equations A = B. If the LHS of the first equation is
 1717   X, then return a goal, otherwise don''t because someone else will.
 1718- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 1719
 1720difv:attribute_goals(Var) --> !.
 1721difv:attribute_goals(Var) -->
 1722    (   { get_attr(Var, difv, vardifv(Ors,_)) } ->
 1723        or_nodesv(Ors, Var)
 1724    ;   or_nodev(Var)
 1725    ).
 1726
 1727or_nodev(O) -->
 1728    (   { get_attr(O, difv, nodev(_, Pairs)) } ->
 1729        { eqs_lefts_rightsv(Pairs, As, Bs) },
 1730        mydifv(As, Bs),
 1731        { del_attr(O, difv) }
 1732    ;   []
 1733    ).
 1734
 1735or_nodesv([], _)       --> [].
 1736or_nodesv([O-_|Os], X) -->
 1737    (   { get_attr(O, difv, nodev(_, Eqs)) } ->
 1738        (   { Eqs = [LHS=_|_], LHS =@@= X } ->
 1739            { eqs_lefts_rightsv(Eqs, As, Bs) },
 1740            mydifv(As, Bs),
 1741            { del_attr(O, difv) }
 1742        ;   []
 1743        )
 1744    ;   [] % or-node already removed
 1745    ),
 1746    or_nodesv(Os, X).
 1747
 1748mydifv([X], [Y]) --> !, difv_if_necessary(X, Y).
 1749mydifv(Xs0, Ys0) -->
 1750    { reverse(Xs0, Xs), reverse(Ys0, Ys), % follow original order
 1751      X =.. [f|Xs], Y =.. [f|Ys] },
 1752    difv_if_necessary(X, Y).
 1753
 1754difv_if_necessary(X, Y) -->
 1755    (   { difv_unifiable(X, Y, _) } ->
 1756        [difv(X,Y)]
 1757    ;   []
 1758    ).
 1759
 1760eqs_lefts_rightsv([], [], []).
 1761eqs_lefts_rightsv([A=B|ABs], [A|As], [B|Bs]) :-
 1762    eqs_lefts_rightsv(ABs, As, Bs).
 type_size(?VALUE1, :PRED1000VALUE2) is semidet
Type Size.
 1768type_size(C,S):-a(completeExtentEnumerable,C),!,setof(E,call_u(t(C,E)),L),length(L,S).
 1769type_size(C,1000000):-a(ttExpressionType,C),!.
 1770type_size(_,1000).
 1771
 1772/*
 1773
 1774?-  Z #=:= 2 + X, Z #< 2 .
 1775
 1776succ(succ(0)).
 1777
 1778S2I
 1779I2E
 1780
 17812
 17822
 17832
 1784E2S
 1785
 1786S = succ/1.
 1787I = integer
 1788E = 2
 1789
 1790a:p(1).
 1791
 1792a:p(X):-b:p(X).
 1793b:p(X):-c:p(X).
 1794
 1795b:p(2).
 1796
 1797*/ 
 comp_type(?Comp, ?Col1, ?Col2) is semidet
Comp Type.
 1804comp_type(Comp,Col1,Col2):-type_size(Col1,S1),type_size(Col2,S2),compare(Comp,S1,S2).
 1805
 1806
 1807:- fixup_exports. 1808
 1809mpred_type_constraints_file.
 goal_expansion(?LC, ?LCOO) is semidet
Hook To [goal_expansion/2] For Module Mpred_type_constraints. Goal Expansion.

system:goal_expansion(G,O):- \+ current_prolog_flag(xref,true),\+ pldoc_loading, nonvar(G),boxlog_goal_expansion(G,O).