1% =======================================================
    2/* 
    3% This is mainly used by the moo_loader but also needed everywhere
    4%
    5% Logicmoo Project PrologMUD: A MUD server written in Prolog
    6% Maintainer: Douglas Miles
    7% Dec 13, 2035
    8%
    9*/
   10% =======================================================
   11% File: /opt/PrologMUD/pack/logicmoo_base/prolog/logicmoo/mpred/mpred_type_args.pl
   12:- module(mpred_type_args,
   13          [ any_to_relation/2,
   14            argIsa_op_call/4,
   15            as_one_of/2,
   16            show_count/1,
   17            assert_argIsa/3,
   18            argIsa_known/3,
   19            assert_predArgTypes/1,
   20            assert_predArgTypes_fa/2,
   21            assert_predArgTypes_from_left/3,
   22            assert_predArgTypes_from_right/3,
   23            assert_predArgTypes_l/3,
   24            atom_to_value/2,
   25            checkAnyType/4,
   26            % coerce/4,
   27            correctAnyType/4,
   28            correctAnyTypeOrFail/4,
   29            correctArgsIsa/2,
   30            correctArgsIsa/3,
   31            %correctArgsIsa/4,
   32            correctArgsIsa/3,
   33            correctArgsIsa00/3,
   34            correctFormatType/4,
   35            correctType/4,
   36            correctType0/4,
   37            correctTypeArg/4,
   38            correctType_gripe/4,
   39            % decl_coerce/3,
   40            %deduceFromArgTypes/1,
   41            deduced_is_tCol/1,
   42            discoverAndCorrectArgsIsa/5,
   43            discoverAndCorrectArgsIsa_from_left/5,
   44            discoverAndCorrectArgsIsa_from_right/5,
   45            evaluatableArg/2,
   46            evaluatableFunctor/1,
   47            %compoundSpecs/2,
   48            %meta_argtypes/1,
   49            % coerce_hook/3,
   50            is_boolean/1,
   51            is_declarations/1,
   52            is_ephemeral/1,
   53            is_id/1,
   54            is_list_of/2,
   55            is_renamed_to/2,
   56            is_rest/1,
   57            is_rest_of/2,
   58            is_spec/1,
   59            is_valuespec/1,
   60            list_to_callform/3,
   61            is_declarations/1,
   62            %mpred_arity_pred/1,
   63            must_equals/2,
   64            must_equals_correct/3,
   65            pl_arg_type/2,
   66            roll_dice/4,
   67            term_is_ft/2,
   68            term_is_ft_how/2,
   69            to_format_type/2,
   70            trans_subft/2,
   71            mpred_type_args_file/0
   72          ]).   73
   74%:- include('mpred_header.pi').
   75
   76% autoloading user:portray_clause_pi/2 from /opt/PrologMUD/pack/logicmoo_base/prolog/logicmoo/util/logicmoo_util_first
   77
   78:- set_how_virtualize_file(bodies).   79
   80
   81
   82/*
   83:- dynamic((
   84        coerce/3,
   85        decl_coerce/3,
   86        deduceFromArgTypes/1,
   87   coerce_hook/3)).
   88*/
 to_format_type(?COL, ?FT) is semidet
Converted To Format Type.

genls-GenlDenotesSpecInstances

   96to_format_type(FT,FT):-a(ttExpressionType,FT),!.
   97to_format_type(COL,FT):- clause_b(formatted_resultIsa(FT,COL)),!.
   98to_format_type(COL,FT):- clause_b(resultIsa(FT,COL)),a(ttExpressionType,FT),!.
   99to_format_type(COL,ftTerm(COL)).
  100
  101% genlsSpecDenotesGenlInstances(FT,COL):-to_format_type(COL,FT).
  102
  103
  104
  105%= 	 	 
 assert_argIsa(?Prop, ?N, ?Type) is semidet
assert Argument (isa/2).
  112assert_argIsa(Prop,N,Type):-show_failure(why,ain_fast(argIsa(Prop,N,Type))).
 assert_predArgTypes(?ArgTs) is semidet
assert Predicate Argument Types.
  120assert_predArgTypes(ArgTs):-not(compound(ArgTs)),!.
  121assert_predArgTypes(ArgTs):- numbervars(ArgTs,0,_,[functor_name(ftTerm),attvar(skip)]),get_functor(ArgTs,F),assert_predArgTypes_fa(F,ArgTs).
  122
  123
  124%= 	 	 
 assert_predArgTypes_fa(?VALUE1, ?ArgTs) is semidet
assert Predicate Argument Types Functor-Arity.
  130assert_predArgTypes_fa(_,ArgTs):- nonvar(ArgTs),ArgTs=(_/_),!.
  131assert_predArgTypes_fa(F,ArgTs):- not(is_list(ArgTs)),ArgTs=..[_|ArgsL],!,assert_predArgTypes_fa(F,ArgsL).
  132%assert_predArgTypes_fa(F,ArgsList):- clause_b(ftAction(F),true),!,show_call(why,must(assert_predArgTypes_from_left(F,1,ArgsList))).
  133assert_predArgTypes_fa(F,ArgsList):- length(ArgsList,L),assert_predArgTypes_l(F,L,ArgsList).
  134
  135%assert_predArgTypes_l(F,L,ArgsList):- arity_no_bc(F,A),!,must( (A>=L) -> assert_predArgTypes_from_right(F,A,ArgsList);true).
 assert_predArgTypes_l(?F, ?L, ?ArgsList) is semidet
assert Predicate Argument Types (List version).
  144assert_predArgTypes_l(F,L,ArgsList):- must(assert_predArgTypes_from_right(F,L,ArgsList)).
  145
  146
  147
  148%= 	 	 
 assert_predArgTypes_from_right(?F, ?A, :TermArgsList) is semidet
assert Predicate Argument Types Converted From right.
  154assert_predArgTypes_from_right(_,_,[]):-!.
  155assert_predArgTypes_from_right(_,_,(_/_)):-!.
  156assert_predArgTypes_from_right(F,A,ArgsList):-append(Left,[Last],ArgsList),
  157   assert_argIsa(F,A,Last),!,Am1 is A -1, assert_predArgTypes_from_right(F,Am1,Left).
  158
  159
  160generateArgVars(P,ArgPred,Else):-
  161 (ground(P)->true;
  162  (arg(N,P,E),var(E),(call_u(call(ArgPred,N,Arg))-> Arg=E, call_u(call(Else,E))),
  163     nonvar(E),generateArgVars(P,ArgPred,Else))).
 assert_predArgTypes_from_left(?F, ?A, :TermType) is semidet
assert Predicate Argument Types Converted From left.
  172assert_predArgTypes_from_left(_,_,[]):-!.
  173assert_predArgTypes_from_left(F,A,[Type|ArgsList]):-assert_argIsa(F,A,Type),!,Ap1 is A + 1,assert_predArgTypes_from_left(F,Ap1,ArgsList).
  174
  175
  176
  177%= 	 	 
 term_is_ft(:TermTerm, :TermType) is semidet
Term If Is A Format Type.
  183term_is_ft(Term,Type):- is_ftVar(Term),!,member(Type,[ftVar,ftProlog]).
  184term_is_ft(_ANY,Type):- Type==ftVar,!,fail.
  185term_is_ft([T|Term],ftListFn(Type)):-is_list_of(Type,[T|Term]).
  186term_is_ft(_ANY,Type):- nonvar(Type),(ttExpressionType==Type;(\+ a(ttExpressionType,Type))),!,fail.
  187term_is_ft(Term,Type):- nonvar(Type), term_is_ft_how(Term,Type),!.
  188term_is_ft(Term,Type):- no_repeats(Type,(term_is_ft_how(Term,Was),trans_subft(Was,Type))).
  189
  190
  191
  192%= 	 	 
 term_is_ft_how(?Term, ?Type) is semidet
Term If Is A Format Type How.
  198term_is_ft_how(Term,Type):- clause_b(quotedDefnIff(Type,Info)),nonvar(Info),
  199   (show_success(why,(Info='uSubLQuoteFn'(LISPSYMBOL),nop(dmsg(Term+Type+LISPSYMBOL))))-> 
  200                 fail;
  201                 (append_term(Info,Term,CALL),call_u(CALL))),!.
  202
  203term_is_ft_how(Term,Type):- compound(Term),functor(Term,F,A),functor(Type,F,A),
  204  once((a(meta_argtypes,Type),Type=..[_|Types],Term=..[_|Args],
  205     maplist(call_as_t,Types,Args))).
  206
  207call_as_t(T,A):-append_term(T,A,Call),call_u(Call).
  208
  209%= 	 	 
 trans_subft(?FT, ?FT) is semidet
Trans Subft.
  215trans_subft(FT,FT).
  216trans_subft(FT,Sub):-clause_b(subFormat(FT,Sub)).
  217trans_subft(FT,Sub):-clause_b(subFormat(FT,A)),clause_b(subFormat(A,Sub)).
  218trans_subft(FT,Sub):-clause_b(subFormat(FT,A)),clause_b(subFormat(A,B)),clause_b(subFormat(B,Sub)).
  219
  220
  221%= 	 	 
 is_id(?ID) is semidet
If Is A Id.
  227is_id(ID):-atom(ID)->true;(compound(ID),arg(1,ID,A),is_id(A)).
  228
  229%= 	 	 
 is_boolean(?VALUE1) is semidet
If Is A Boolean.
  235is_boolean(isMissing):-!,fail.
  236is_boolean(vTrue).
  237is_boolean(vFalse).
  238
  239
  240%= 	 	 
 is_declarations(?C) is semidet
If Is A Declarations.
  246is_declarations(TypesIn):- strip_module(TypesIn,_,Types), compound(Types), ground(Types), Types\=(_/_), Types\=(_:_/_), Types\='$VAR'(_),!, (\+ (arg(_,Types,T), \+ is_spec(T))).
  247
  248
  249%= 	 	 
 is_spec(?T) is semidet
If Is A Spec.
  255is_spec(T):- call_u(tCol(T))->true;is_declarations(T).
 is_rest(:TermARG1) is semidet
If Is A Rest.
  264is_rest([_|Term]):-not(is_list(Term)).
  265
  266%= 	 	 
 is_rest_of(?Type, :TermARG2) is semidet
If Is A Rest Of.
  272is_rest_of(_Type,[_|Term]):-not(is_list(Term)).
  273
  274%= 	 	 
 is_list_of(?Type, :TermTerm) is semidet
If Is A List Of.
  280is_list_of(Type,Term):- is_rest(Term),!,Type=ftTerm.
  281is_list_of(Type,[T|Term]):-term_is_ft(T,Type),maplist(is_list_of(Type),Term).
  282
  283/*
  284pl_arg_type_or_functor(Arg,Type):- pl_arg_type(Arg,T) , 
  285 (T==ftCompound -> functor(Arg,Type,_); 
  286  ( (T==ftListFn(_),Arg=[_|_])-> T=[Type|_] ;
  287         Type=T)) .
  288
  289sameArgTypes(A,C):-same(A,C);(pl_arg_type(C,CT),pl_arg_type(A,AT),!,colsOverlap(AT,CT)).
  290colsOverlap(AT,AT).
  291
  292*/
  293
  294
  295%= 	 	 
 pl_arg_type(?Arg, ?Type) is semidet
Pl Argument Type.
  301pl_arg_type(Arg,Type):- 
  302      var(Arg) -> Type =ftVar;
  303      integer(Arg) -> Type =ftInt;
  304      number(Arg) -> Type =ftFloat;
  305      string(Arg) -> Type =ftString;
  306      is_ftText(Arg) -> Type =ftText;
  307      is_list(Arg) -> Type = ftList;
  308  /* is_list(Arg) -> Type =ftListFn(_); */
  309      atom(Arg) -> Type =ftAtom;
  310      atomic(Arg) -> Type =ftAtomic;
  311      compound(Arg) -> Type =ftCompound;
  312         Arg = Type.
  313
  314
  315
  316
  317
  318% :- was_dynamic(coerce/3).
  319:- was_export(coerce/4).  320
  321%= 	 	 
 coerce(?VALUE1, ?VALUE2, ?NewThing, ?Else) is semidet
Coerce.
  327coerce(What,Type,NewThing,_Else):- call_u(coerce(What,Type,NewThing)),!.
  328coerce(_ ,_,     NewThing,Else):- NewThing = Else.
  329
  330coerce(A,B,C):-no_repeats(call_u(coerce_hook(A,B,C))),nop((sanity(show_failure(call_u(isa(C,B))))->!;true)).
  331
  332
  333
  334
  335
  336%= 	 	 
 as_one_of(?Type, ?TypeO) is semidet
Converted To One Of.
  342as_one_of(Types,Type):-nonvar(Type),tCol(Type),!,member(Type,Types).
  343as_one_of([Type],TypeO):-!,same_arg(same_or(genls),Type,TypeO).
  344as_one_of(Types,isOneOf(Types)).
  345
  346
  347
  348%= 	 	 
 argIsa_op_call(?Op, :TermFunc, ?N, ?Type) is semidet
Argument (isa/2) Oper. call.
  354argIsa_op_call(Op,_:F,N,Type):-!,argIsa_op_call(Op,F,N,Type),!.
  355argIsa_op_call(Op,F/_,N,Type):- !,argIsa_op_call(Op,F,N,Type),!.
  356argIsa_op_call(Op,Func,N,Type):- compound(Func),!,functor(Func,F,_),argIsa_op_call(Op,F,N,Type),!.
  357argIsa_op_call(_,F,N,Type):-quietly((loop_check((call_u(argIsa(F,N,Type)),!),Type=ftTerm),must(nonvar(Type)))).
  358
  359argIsa_known(F,N,Type):-argIsa_op_call(_,F,N,Type).
  360
  361
  362:- was_export(correctArgsIsa/2).  363
  364%= 	 	 
 correctArgsIsa(?In, ?Out) is semidet
correct Arguments (isa/2).
  370correctArgsIsa(In,Out):- correctArgsIsa(query(must,t),In,Out),!.
  371
  372:- was_export(correctArgsIsa/3).  373
  374%= 	 	 
 correctArgsIsa(?VALUE1, :TermNC, :TermNC) is semidet
correct Arguments (isa/2).

correctArgsIsa0(_,G,G):- (\+ t_l:infMustArgIsa), (is_release; bad_idea; skipWrapper; t_l:infSkipArgIsa),!. correctArgsIsa(_,G,G):-!.

  382correctArgsIsa(_,G,GG):- t_l:infSkipArgIsa, !,must_equals(G,GG).
  383correctArgsIsa(_,G,GG):- sanity(var(GG)), ( \+ compound(G)), !,must(G=GG).
  384% correctArgsIsa(Op,G,GG):- correctArgsIsa0(Op,G,GG),var(GG),!,break,correctArgsIsa0(Op,G,GG),break,break.
  385correctArgsIsa(Op,G,GG):- must((correctArgsIsa0(Op,G,GG),sanity(nonvar(GG)))).
  386
  387correctArgsIsa0(_,NC,NC):- \+ compound(NC),!.
  388correctArgsIsa0(Op,G,GG):- is_list(G),!,must_maplist(correctArgsIsa0(Op),G,GG).
  389correctArgsIsa0(Op,M:G,MAA):- nonvar(M),!,correctArgsIsa0(Op,G,GG),M:GG=MAA.
  390correctArgsIsa0(_,ISA,GG):- was_isa(ISA,_,_),!,must_equals(ISA,GG).
  391correctArgsIsa0(Op,(A,B),(AA,BB)):-!,correctArgsIsa0(Op,A,AA),correctArgsIsa0(Op,B,BB).
  392correctArgsIsa0(Op,(A;B),(AA;BB)):-!,correctArgsIsa0(Op,A,AA),correctArgsIsa0(Op,B,BB).
  393correctArgsIsa0(_,G,GG):- get_functor(G,F),functor_no_correct(F),!,must_equals(G,GG).
  394correctArgsIsa0(Op,A,RESULTC):-A=..[PRED|ARGS],correctArgsIsa00(Op,[PRED|ARGS],RESULT), list_to_callform(RESULT,t,RESULTC).
  395
  396functor_no_correct(F):-lookup_u(functorDeclares(F)).
  397functor_no_correct(agent_text_command).
  398
  399
  400:- was_export(correctArgsIsa/4).  401
  402%= 	 	 
 correctArgsIsa(?Op, ?A, ?Type, ?AA) is semidet
correct Arguments (isa/2).

correctArgsIsa(Op,A,Type,AA):- trace_or_throw(warn(not(correctArgsIsa(Op,A,Type,AA)))).

  411%= 	 	 
 list_to_callform(?ARGS, ?Functor, ?CALL) is semidet
List Converted To Callform.
  417list_to_callform([P|ARGS],_,CALL):-atom(P),!,CALL=..[P|ARGS].
  418list_to_callform(ARGS,Functor,CALL):-CALL=..[Functor|ARGS].
  419
  420
  421
  422show_count(F/A):- functor(P,F,A), predicate_property(M:P,number_of_clauses(N)),dmsg(F=M:N).
  423
  424%= 	 	 
 correctArgsIsa00(?VALUE1, :TermProp, :TermAA) is semidet
correct Arguments (isa/2) Primary Helper Primary Helper.
  430correctArgsIsa00(_ ,[Prop|Args],AA):-stack_check(1000), var(Prop),!,AA=[Prop|Args].
  431correctArgsIsa00(Op,[KP,Prop|Args],AA):-is_holds_true(KP),!,correctArgsIsa00(Op,[Prop|Args],AA).
  432correctArgsIsa00(Op,[KP,Prop|Args],[KP|AArgs]):-logical_functor_ft(KP),!,correctAnyType(Op,[Prop|Args],ftListFn(ftAskable),AArgs).
  433correctArgsIsa00(Op,[KP,Prop|Args],[KP|AA]):-is_holds_false(KP),!,correctArgsIsa00(Op,[KP,Prop|Args],AA).
  434%correctArgsIsa00(_ ,[Prop,Arg],[Prop,Arg]):- !.
  435correctArgsIsa00(Op,[Prop,ArgI],[Prop,ArgO]):- a(tCol,Prop),!, correctAnyType(query(ftID,Op),ArgI,Prop,ArgO).
  436correctArgsIsa00(Op,[Prop|Args],[Prop|AArgs]):- discoverAndCorrectArgsIsa(Op,Prop,1,Args,AArgs).
  437
  438
  439%= 	 	 
 discoverAndCorrectArgsIsa(?Op, ?Prop, ?VALUE3, ?ArgsIn, ?ArgsOut) is semidet
discover and correct Arguments (isa/2).
  445discoverAndCorrectArgsIsa(Op,Prop,_,ArgsIn,ArgsOut):- length(ArgsIn,ArgUsed), /*show_failure*/ (
  446 (arity_no_bc(Prop,MaxArity),(number(ArgUsed),number(MaxArity),ArgUsed=<MaxArity))),
  447    discoverAndCorrectArgsIsa_from_right(Op,Prop,MaxArity,ArgsIn,ArgsOut),!.
  448discoverAndCorrectArgsIsa(Op,Prop,N,ArgsIn,ArgsOut):-discoverAndCorrectArgsIsa_from_left(Op,Prop,N,ArgsIn,ArgsOut),!.
  449
  450
  451%= 	 	 
 discoverAndCorrectArgsIsa_from_right(?Op, ?Prop, ?N1, ?In, ?Out) is semidet
discover and correct Arguments (isa/2) Converted From right.
  457discoverAndCorrectArgsIsa_from_right(_O,_Prop,_N1,[],[]):-!.
  458discoverAndCorrectArgsIsa_from_right(Op,Prop,N1,In,Out):- append(Args,[A],In),
  459   ((argIsa_op_call(Op,Prop,N1,Type),must(correctAnyType(Op,A,Type,AA)))-> true ; A=AA),!,
  460   N2 is N1-1,
  461   discoverAndCorrectArgsIsa_from_right(Op,Prop,N2,Args,AArgs),
  462   ignore(AA=A),
  463   append(AArgs,[AA],Out).
 discoverAndCorrectArgsIsa_from_left(?O, ?Prop, ?N1, :TermARG4, ?VALUE5) is semidet
discover and correct Arguments (isa/2) Converted From left.
  471discoverAndCorrectArgsIsa_from_left(_O,_Prop,_N1,[],[]):-!.
  472discoverAndCorrectArgsIsa_from_left(Op,Prop,N1,[A|Args],Out):-
  473   ((argIsa_op_call(Op,Prop,N1,Type),must(correctAnyType(Op,A,Type,AA)))->true;A=AA),!,
  474   N2 is N1+1,
  475   ignore(AA=A),
  476   discoverAndCorrectArgsIsa_from_left(Op,Prop,N2,Args,AArgs),
  477    Out = [AA|AArgs].
  478
  479
  480
  481
  482%= 	 	 
 is_ephemeral(:TermVar) is semidet
If Is A Ephemeral.
  488is_ephemeral(Var):-var(Var),!,fail.
  489is_ephemeral(isMissing).
  490is_ephemeral(isOptional(_,_)).
  491is_ephemeral(isRandom(_)).
  492is_ephemeral(isOneOf(_)).
  493
  494:- was_export(correctAnyType/4).  495
  496
  497%= 	 	 
 is_valuespec(?G) is semidet
If Is A Valuespec.
  503is_valuespec(G):-var(G),!,fail.
  504is_valuespec(G):-is_ephemeral(G).
  505is_valuespec(G):-a(tCol,G).
  506is_valuespec(FT):-a(ttExpressionType,FT).
  507is_valuespec(G):-evaluatableArg(G,_).
  508
  509
  510%= 	 	 
 evaluatableArg(?AA, ?VALUE2) is semidet
Evaluatable Argument.
  516evaluatableArg(AA,_Value):-fail,sanity(nonvar(AA)),compound(AA),get_functor(AA,F),!,evaluatableFunctor(F).
  517
  518%= 	 	 
 evaluatableFunctor(?VALUE1) is semidet
Evaluatable Functor.
  524evaluatableFunctor(isRandom).
  525evaluatableFunctor(isOptional).
  526
  527
  528%= 	 	 
 correctAnyType(?VALUE1, ?A, ?VALUE3, ?A) is semidet
Correct Any Type.
  535% ?- correctAnyType(query(must,t),ab_c,ftString,O).
  536% ?- correctType(query(must,t),ab_c,ftString,O).
  537% correctAnyType(_,A,_,A):- bad_idea.
  538
  539correctAnyType(_, A,_Type,AA):- is_ftVar(A),sanity(var(AA)),A=AA,must_det(A==AA),!.
  540correctAnyType(Op,A,Type,AA):-  var(Type),!,trace_or_throw(var_correctAnyType(Op,A,Type,AA)).
  541% correctAnyType(Op,A,Type,AA):-  var(A),!,must(correctType(Op,A,Type,AA)),sanity(var(AA)),sanity(A==AA).
  542% correctAnyType(_, A,Type,AA):-  evaluatableArg(Type,A)->dmsg(evaluatableArg(A,Type))->must_det(A=AA),!.
  543correctAnyType(Op,A,Type,AA):- var(Type),trace_or_throw(correctAnyType(Op,A,Type,AA)).
  544% TODO snags on new tpyes correctAnyType(Op,A,Type,AA):- correctType(Op,A,Type,AA),nonvar(AA),!.
  545correctAnyType(Op,A,Type,AA):- correctType(Op,A,Type,AA),!,sanity(nonvar(AA)).
  546correctAnyType(Op,A,Type,AA):- must(A=AA),atom(Type),atom(A),!,nop(dmsg(dtrace(warn(not(correctAnyType(op(Op),arg(A),type(Type))))))).
  547correctAnyType(Op,A,Type,AA):- must(A=AA),dmsg(dtrace(nop(warn(not(correctAnyType(op(Op),arg(A),type(Type))))))).
  548
  549
  550
  551%  @set mudMoveDist 4
  552
  553:- was_export(correctFormatType/4).  554
  555%= 	 	 
 correctFormatType(?Op, ?A, ?Type, ?AA) is semidet
Correct Format Type.
  561correctFormatType(Op,A,Type,AA):- var(A),correctType(Op,A,Type,AA),sanity(var(AA)),must_det(A==AA),!,ignore(A=AA).
  562correctFormatType(Op,A,Type,AA):- var(Type),trace_or_throw(correctFormatType(Op,A,Type,AA)).
  563correctFormatType(Op,A,Type,AA):- correctType(Op,A,Type,AA),sanity(nonvar(AA)),!.
  564correctFormatType(Op,A,Type,AA):- tracing, correctType(Op,A,Type,AA).
  565correctFormatType(Op,A,Type,A):- dmsg(todo(not(correctFormatType(Op,A,Type)))),fail.
  566
  567:- was_export(checkAnyType/4).  568
  569
  570%= 	 	 
 checkAnyType(?Op, ?A, ?Type, ?AA) is semidet
Check Any Type.
  576checkAnyType(Op,A,Type,A):- var(A),correctType(Op,A,Type,AA),!,sanity(var(AA)),(A==AA).
  577checkAnyType(Op,A,Type,A):- correctType(Op,A,Type,AA),nonvar(AA),!,(AA=@=A).
  578
  579
  580%= 	 	 
 correctAnyTypeOrFail(?Op, ?A, ?Type, ?AA) is semidet
Correct Any Type Or Fail.
  586correctAnyTypeOrFail(Op,A,Type,AA):- locally(tlbugger:skipMust,correctType(Op,A,Type,AA)),A\=@=AA.
  587
  588
  589
  590:- thread_local t_l:can_coerce/1.  591
  592%= 	 	 
 correctType_gripe(?Op, ?A, ?Fmt, ?AA) is semidet
Correct Type Gripe.
  598correctType_gripe(Op,A,Fmt,AA):- a(ttExpressionType,Fmt),!,trace_or_throw(correctType(is_ft_correctFormatType(Op,A,Fmt,AA))).
  599correctType_gripe(Op,A,Type,AA):- fail,atom(Type),must_equals(A,AA),
  600      dmsg(todo(isa_assert_type(Type))),
  601      % decl_type(Type),
  602      t_l:can_coerce(Op),
  603      dmsg(warning(ain(isa(A,Type)))),
  604      dtrace(ain(isa(A,Type))),!.
  605
  606correctType_gripe(Op,A,C,A):-sanity(ground(A)),dmsg(todo(define(correctType(Op,A,C,'ConvertedArg')))),throw(retry(_)).
  607correctType_gripe(Op,A,Type,NewArg):-trace_or_throw(failure(correctType(Op,A,Type,NewArg))).
  608
  609:- style_check(+singleton).  610
  611
  612%= 	 	 
 is_renamed_to(?A, ?AA) is semidet
If Is A Renamed Converted To.
  618is_renamed_to(A,AA):- fail,atomic(A),not(A=[];A='';A=""),not(atom_concat(_,'Table',A)),not(atom_concat(_,'table',A)),
  619    atom_concat(Base,'able',A),atom_length(Base,AL),AL>2,!,atom_concat(Base,'Able',AA).
  620
  621
  622%= 	 	 
 correctType(?Op, ?A, ?Type, ?AA) is semidet
Correct Type.
  628correctType(Op,A,Type,AA):- sanity(nonvar(Type)), loop_check(correctType0(Op,A,Type,AA)).
  629
  630
  631
  632is_call_like(ftCallable).
  633is_call_like(ftAskable).
  634is_call_like(ftAssertable).
  635
  636is_uncheckable(X):-is_call_like(X).
  637is_uncheckable(tCol).
  638is_uncheckable(tSet).
  639is_uncheckable(ftProlog).
  640is_uncheckable(ftTerm).
  641
  642ensure_never_ft_binding(C):- ignore((var(C),\+ attvar(C),freeze(C, \+ (atom(C),atom_concat('ft',_,C))))).
 correctType0(?Op, :TermA, :TermType, :TermAA) is semidet
Correct Type Primary Helper.
  649correctType0(change(_,_),A,T,AA):- A==T,!,must_equals(A,AA).
  650correctType0(_ ,A,T,AA):- A==T,!,must_equals(A,AA).
  651correctType0(Op,A,Type,AA):- var(Type),trace_or_throw(correctType(Op,A,Type,AA)).
  652correctType0(_,A,_,AA):- var(A),!, must_equals(A,AA).
  653
  654correctType0(_ ,A,FTType,AA):- quotedIsa(A,FTType),!, must_equals(A,AA).
  655correctType0(_ ,A,ftString,AA):- !, must(any_to_string(A,AA)),!.
  656correctType0(_ ,A,ftText,AA):- atomic(A),convert_to_cycString(A,AA),!.
  657correctType0(_ ,A,ftText,AA):- any_to_string(A,M),convert_to_cycString(M,AA),!.
  658correctType0(Op,A,ftTerm(_),AA):- loop_check(must_equals_correct(Op,A,AA),
  659                        ((A=AA,dmsg(looped_on(correctType0(Op,A,ftTerm(_),AA)))))).
  660correctType0(_ ,A,FTType,A):- isa(A,FTType),!.
  661correctType0(_ ,String,ftNumber,Number):- string(String),!, any_to_number(String,Number).
  662
  663
  664correctType0(_ ,A,Type,AA):- is_uncheckable(Type), must_equals(A,AA).
  665
  666correctType0(Op,A,Type,AA):-  is_call_like(Type),!,must_equals_correct(query(Type,Op),A,AA).
  667correctType0(Op,A,ftID,AA):- must_equals_correct(query(ftID,Op),A,AA),!.
  668
  669correctType0(_ ,A,tCol,AA):- atom(A),!,must_equals(A,AA).
  670
  671correctType0(_ ,A,Type,AA):-A==Type,!,A=AA.
  672
  673correctType0(query(ftID,Op),A,ftAction,AA):- must_equals_correct(Op,A,AA),!.
  674correctType0(Op,A,Type,AAA):-is_renamed_to(A,AA),!,must(correctType(Op,AA,Type,AAA)).
  675correctType0(Op,+A,Type,+AA):-nonvar(A),!,correctType(Op,A,Type,AA).
  676correctType0(Op,-A,Type,-AA):-nonvar(A),!,correctType(Op,A,Type,AA).
  677correctType0(_ ,A,ftInt,AA):- any_to_number(A,AA).
  678correctType0(_ ,A,ftNumber,AA):- any_to_number(A,AA).
  679correctType0(_ ,A,ftVoprop,AA):- !, must(A=AA).
  680correctType0(Op,A,ftVoprop,AA):- is_list(A),!,maplist(correctTypeArg(Op,ftAskable),A,AA).
  681correctType0(Op,A,ftVoprop,AA):- !,locally(t_l:inVoprop,correctType(Op,A,ftAskable,AA)).
  682
  683correctType0(_ ,A,tPred,AA):- any_to_relation(A,AA).
  684correctType0(_ ,A,tFunction,AA):- any_to_relation(A,AA).
  685correctType0(_ ,A,tRelation,AA):- any_to_relation(A,AA).
  686correctType0(_ ,A,ftAtom,AA):- any_to_atom(A,AA).
  687correctType0(change(_,_),A,tCol,AA):- atom(A),deduced_is_tCol(A),must_equals(A,AA).
  688correctType0(change(_,_),A,tCol,AA):- compound(A),deduced_is_tCol(A),must_equals(A,AA).
  689correctType0(_ ,A,vtVerb,AA):- must_equals(A,AA).
  690correctType0(_ ,A,Type,AA):- compound(A),( \+ is_list(A)),atom(Type),functor_safe(A,Type,_), must_equals(A,AA).
  691correctType0(_ ,A,Type,AA):- \+ (a(ttExpressionType,Type)),a(tCol,Type),isa_asserted(A,Type),!,must_equals(A,AA).
  692correctType0(Op,A,Fmt,AA):- trans_subft(Fmt,Code),Fmt\=Code,correctType(Op,A,Code,AA).
  693correctType0(Op,A,Super,AA):- a(ttExpressionType,Super),call_u(genls(Sub,Super)),Sub\=Super,correctType(Op,A,Sub,AA).
  694
  695correctType0(_ ,What,Type,NewThing):- call_u(coerce(What,Type,NewThing)),!.
  696
  697correctType0(Op,[A|NIL],ftListFn(T),[L]):-NIL==[],!,correctAnyType(Op,A,T,L).
  698correctType0(Op,[A|AA],ftListFn(T),[L|LIST]):-!,correctAnyType(Op,A,T,L),correctType0(Op,AA,ftListFn(T),LIST).
  699
  700correctType0(Op,A,ftListFn(T),[OT]):-!,correctAnyType(Op,A,T,OT).
  701correctType0(_ ,[],[],[]):-!.
  702correctType0(Op,[H|T],[H2|T2],[H3|T3]):-!, correctAnyType(Op,H,H2,H3),correctType(Op,T,T2,T3).
  703
  704correctType0(_,A,_,_):- \+ (compound(A)),!,fail.
  705
  706
  707
  708correctType0(_ ,A,ftListFn(_),AA):- A == [],!,A=AA.
  709correctType0(Op,[A|AA],ftListFn(T),[L|LIST]):-!, correctType(Op,A,T,L), correctType(Op,AA,ftListFn(T),LIST).
  710correctType0(Op,A,ftListFn(T),[OT]):-!,correctAnyType(Op,A,T,OT).
  711correctType0(_ ,A,same(T),AA):-must_equals(T,AA),must_equals(A,AA).
  712correctType0(Op,A,isOneOf(List),AA):-!,member(Type,List),correctType(Op,A,Type,AA).
  713
  714
  715correctType0(Op,A,'&'(Type1,Type2),AA):-var(Type2),!,correctType(Op,A,Type1,AA).
  716correctType0(Op,A,'&'(Type1,Type2),AAA):-!,correctType(Op,A,Type1,AA),correctType(Op,AA,Type2,AAA).
  717
  718correctType0(_ ,Obj,argIsaFn(_Prop,N),AA):-must_equals(Obj,AA),
  719   ignore((t_l:deduceArgTypes(_),
  720     sanity(N\=0),
  721      findall(OT,call_u(isa_asserted(Obj,OT)),_OType),
  722         ! /* must(nop(deduce_argN(Prop,N,Obj,OType,argIsaFn(Prop,N)))) */ )),!.
  723
  724
  725correctType0(_ ,A,Type,AA):- contains_var(Type,isThis),
  726   subst(Type,isThis,A,Call1),subst(Call1,value,AA,Call2),!,
  727      show_call(why,(Call2)),ignore(AA=A).
  728
  729correctType0(_ ,A,Type,AA):- functor(Type,F,A),
  730   (A2 is A+2,current_predicate(F/A2)->show_call(why,clause_u(t(Type,A,AA)));
  731   (A1 is A+1,current_predicate(F/A1)->show_call(why,clause_u(t(Type,A))));
  732   fail),ignore(AA=A).
  733
  734%TODO Confirm vtDirection is coerce/3'd correctType(_ ,A,vtDirection,AA):- call((current_predicate(any_to_dir/2),!,call(any_to_dir,A,AA))),!.
  735%TODO Confirm vtDirection is coerce/3'd correctType(_ ,A,vtDirection,AA):- must_equals(A,AA).
  736
  737correctType0(query(HLDS,Must),A,xyzFn(Region, ftInt, ftInt, ftInt),xyzFn(AA, _, _, _)):-atom(A),correctAnyType(query(HLDS,Must),A,Region,AA).
  738
  739correctType0(_ ,[],ftFormFn([]),[]):-!.
  740correctType0(Op,[H|T],ftFormFn([H2|T2]),[H3|T3]):-
  741   correctType(Op,H,H2,H3),
  742   correctType(Op,T,ftFormFn(T2),T3).
  743
  744correctType0(Op,Args,ftFormFn(Types),NewArgs):- compound(Args),compound(Types),
  745   functor(Args,F,N),functor(Types,F,N),functor(NewArgs,F,N),
  746   Args=..[F|ArgsL],
  747   Types=..[F|TypesL],
  748   NewArgs=..[F|NewArgsL],!,   
  749   correctType(Op,ArgsL,TypesL,NewArgsL).
  750
  751correctType0(Op,Args,Types,NewArgs):-compound(Args), 
  752   functor(Args,F,N),functor(Types,F,N),functor(NewArgs,F,N),
  753   Args=..[F|ArgsL],
  754   Types=..[F|TypesL],
  755   NewArgs=..[F|NewArgsL],
  756   correctAnyType(Op,ArgsL,TypesL,NewArgsL).
  757
  758correctType0(Op,Arg,Props,NewArg):- 
  759   Props=..[F|TypesL],
  760   functor(Props,F,A),
  761   A2 is A+1,
  762   arity_no_bc(F,A2),
  763   C=..[F,Arg|TypesL],
  764   correctArgsIsa(Op,C,CC),
  765   CC=..[F,NewArg|_].
  766
  767correctType0(Op,A,T,AAA):- once(correctArgsIsa(Op,A,AA)),A\=AA,!,correctType(Op,AA,T,AAA).
  768correctType0(_ ,A,T,AA):- get_functor(A,F),clause_b(resultIsa(F,T)),must_det(A=AA),!.
  769correctType0(_ ,A,T,AA):- get_functor(A,F),clause_b(formatted_resultIsa(F,T)),must_det(A=AA),!.
  770
  771
  772
  773%= 	 	 
 correctTypeArg(?Op, ?Type, ?A, ?AA) is semidet
Correct Type Argument.
  779correctTypeArg(Op,Type,A,AA):-correctType(Op,A,Type,AA).
  780
  781
  782%= 	 	 
 must_equals_correct(?Op, ?A, ?AA) is semidet
Must Be Successfull Equals Correct.
  788must_equals_correct(Op,A,AA):-must(correctArgsIsa(Op,A,AA)).
  789
  790% :- style_check(+singleton).
  791
  792
  793%= 	 	 
 must_equals(?A, ?AA) is semidet
Must Be Successfull Equals.
  799must_equals(A,AA):-must_det(A=AA).
  800
  801
  802%= 	 	 
 deduced_is_tCol(?VALUE1) is semidet
Deduced If Is A True Structure Col.
  808deduced_is_tCol(A):- (t_l:infSkipArgIsa->true; (a(tCol,A)->true;(fail,ain(isa(A,tCol))))),!.
  809:- style_check(+singleton).  810
  811
  812%= 	 	 
  813
  814:- export(correctArgsIsa/3).  815
  816
  817:- was_export(atom_to_value/2).  818
  819%= 	 	 
  820
  821
  822
  823%= 	 	 
 any_to_relation(?A, ?F) is det
Any Converted To Relation.
  829any_to_relation(A,F):-atomic(A),!,any_to_atom(A,F).
  830any_to_relation(A,F):-functor_h(A,F),!.
  831
  832
  833%= 	 	 
 roll_dice(?Rolls, ?VALUE2, ?Bonus, ?Result) is semidet
Roll Dice.
  839roll_dice(Rolls,_,Bonus,Result):- Rolls < 0, !, Result is Bonus.
  840roll_dice(Rolls,Sided,Bonus,Result):- LessRolls is Rolls-1, roll_dice(LessRolls,Sided, Bonus + random(Sided) +1, Result).
  841
  842% call_argIsa_ForAssert(F,N,Type):-argIsa(F,N,Type),atom(Type),!,not(nonusefull_deduction_type(Type)),tCol(Type).
  843
  844:- fixup_exports.  845
  846mpred_type_args_file