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*/
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%=
112assert_argIsa(Prop,N,Type):-show_failure(why,ain_fast(argIsa(Prop,N,Type))).
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%=
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).
144assert_predArgTypes_l(F,L,ArgsList):- must(assert_predArgTypes_from_right(F,L,ArgsList)). 145 146 147 148%=
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))).
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%=
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%=
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%=
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%=
227is_id(ID):-atom(ID)->true;(compound(ID),arg(1,ID,A),is_id(A)). 228 229%=
235is_boolean(isMissing):-!,fail. 236is_boolean(vTrue). 237is_boolean(vFalse). 238 239 240%=
246is_declarations(TypesIn):- strip_module(TypesIn,_,Types), compound(Types), ground(Types), Types\=(_/_), Types\=(_:_/_), Types\='$VAR'(_),!, (\+ (arg(_,Types,T), \+ is_spec(T))). 247 248 249%=
255is_spec(T):- call_u(tCol(T))->true;is_declarations(T).
264is_rest([_|Term]):-not(is_list(Term)). 265 266%=
272is_rest_of(_Type,[_|Term]):-not(is_list(Term)). 273 274%=
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%=
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%=
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%=
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%=
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%=
370correctArgsIsa(In,Out):- correctArgsIsa(query(must,t),In,Out),!. 371 372:- was_export(correctArgsIsa/3). 373 374%=
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)
:- trace_or_throw(warn(not(correctArgsIsa(Op,A,Type,AA))))
.
411%=
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%=
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%=
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%=
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).
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%=
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%=
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%=
516evaluatableArg(AA,_Value):-fail,sanity(nonvar(AA)),compound(AA),get_functor(AA,F),!,evaluatableFunctor(F). 517 518%=
524evaluatableFunctor(isRandom). 525evaluatableFunctor(isOptional). 526 527 528%=
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%=
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%=
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%=
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%=
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%=
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%=
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))))).
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%=
779correctTypeArg(Op,Type,A,AA):-correctType(Op,A,Type,AA). 780 781 782%=
788must_equals_correct(Op,A,AA):-must(correctArgsIsa(Op,A,AA)). 789 790% :- style_check(+singleton). 791 792 793%=
799must_equals(A,AA):-must_det(A=AA). 800 801 802%=
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%=
829any_to_relation(A,F):-atomic(A),!,any_to_atom(A,F). 830any_to_relation(A,F):-functor_h(A,F),!. 831 832 833%=
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