1/* Part of LogicMOO Base Logicmoo Path Setups
    2% ===================================================================
    3% File '$FILENAME.pl'
    4% Purpose: An Implementation in SWI-Prolog of certain debugging tools
    5% Maintainer: Douglas Miles
    6% Contact: $Author: dmiles $@users.sourceforge.net ;
    7% Version: '$FILENAME.pl' 1.0.0
    8% Revision: $Revision: 1.1 $
    9% Revised At:  $Date: 2002/07/11 21:57:28 $
   10% Licience: LGPL
   11% ===================================================================
   12*/
   13% File: /opt/PrologMUD/pack/logicmoo_base/prolog/logicmoo/util/logicmoo_util_body_nauts.pl
   14:- module(logicmoo_util_body_nauts,
   15          [ enable_nautifiers/0,
   16            do_nautifier/4,
   17            disable_nautifiers/0]).   18
   19:- style_check(+singleton).   20:- style_check(+discontiguous).   21% :- style_check(-atom).
   22% :- style_check(-naut).
   23
   24/*
   25delete_eq([],Item,[]):-!,dmsg(warn(delete_eq([],Item,[]))).
   26delete_eq([L|List],Item,List):-Item==L,!.
   27delete_eq([L|List],Item,[L|ListO]):-delete_eq(List,Item,ListO),!.
   28% user:term_expansion(I,O):- current_predicate(logicmoo_bugger_loaded/0),not(t_l:into_form_code),e2c_term_expansion(I,O).
   29*/
   30
   31:- ensure_loaded(logicmoo_util_body_file_scope).   32:-meta_predicate(do_nautifier(+,+,+,-)).   33
   34
   35
   36do_nautifier(_,_ ,A,A):- ( \+ compound(A) ; is_list(A)),!.
   37do_nautifier(Head,Vars ,(DECL,BodI),BodO):- compound(DECL),DECL=cycnaut(StrVar), !,
   38   do_nautifier(Head,Vars,nautArg(StrVar,BodI),BodO). 
   39do_nautifier(_,_ ,call(H),call(H)):-!.
   40do_nautifier(Head,Vars,nautArg(StrVar,BodI),nautArgUC(StrVar,NewVar,OOO)):- !, vsubst(BodI,StrVar,NewVar,BodO),
   41   do_nautifier(Head,Vars,BodO,OOO).
   42do_nautifier(Head,[StrVar|Vars],BodI,BodO):- !, do_nautifier(Head,Vars,nautArg(StrVar,BodI),BodO). 
   43do_nautifier(Head,Vars,V^(H),V^(HO)):- !,do_nautifier(Head,Vars,H,HO).
   44
   45:- enable_body_reorder.   46
   47do_nautifier(Head,Vars,BodI,BodO):- compound(BodI),functor(BodI,F, _),
   48   reorderBody(cyckb_t_e2c(argIsa,F,N,NAUTType),fail,ttNAUTType(NAUTType)),arg(N,BodI,StrVar),!,
   49   do_nautifier(Head,Vars,nautArg(StrVar,BodI),BodO). 
   50/*
   51do_nautifier(Head,Vars,(H,L),(HO,LO)):-!, do_nautifier(Head,Vars,H,HO),do_nautifier(Head,Vars,L,LO).
   52do_nautifier(Head,Vars,(C->H;L),(CO->HO;LO)):-!, do_nautifier(Head,Vars,C,CO),do_nautifier(Head,Vars,H,HO),do_nautifier(Head,Vars,L,LO).
   53do_nautifier(Head,Vars,(H->L),(HO->LO)):-!, do_nautifier(Head,Vars,H,HO),do_nautifier(Head,Vars,L,LO).
   54do_nautifier(Head,Vars,(H;L),(HO;LO)):-!, do_nautifier(Head,Vars,H,HO),do_nautifier(Head,Vars,L,LO).
   55do_nautifier(Head,Vars,'{}'(H),'{}'(HO)):- !,do_nautifier(Head,Vars,H,HO).
   56*/
   57do_nautifier(Head,Vars,H,HO):- H=..HL, must_maplist(do_nautifier(Head,Vars),HL,HOL),HO=..HOL.
   58
   59
   60ttNAUTType('CharacterNAUT').
   61ttNAUTType('SubLNAUT').
   62ttNAUTType('SubLListOfNAUTs').
   63% ttNAUTType(['ListOfTypeFn', X]):-atom(X),ttNAUTType(X).
   64
   65
   66nautArg(User,CallWithUser):- dtrace,vsubst(no_repeats(CallWithUser),User,Cyc,CallWithCyc),!, (ground(User) -> (ssz(User,Cyc),CallWithCyc)  ; (CallWithCyc, ssz(User,Cyc))).
   67
   68
   69nautArgUC(User,Cyc,CallWithCyc):- must_det(var(Cyc)),!,nautArgUC2(User,Cyc,CallWithCyc).
   70nautArgUC2(User,Cyc,CallWithCyc):- var(User),!,CallWithCyc,cycNAUTToNAUT(Cyc,User).
   71nautArgUC2([User,U2|MORE],Cyc,CallWithCyc):- Cyc=[User,U2|MORE],!,CallWithCyc.
   72nautArgUC2([User],Cyc,CallWithCyc):- Cyc=User,!,CallWithCyc,atom(Cyc).
   73
   74cycNAUTToNAUT(Cyc,User):- (atom(Cyc)->User=[Cyc];User=Cyc),!.
   75      
   76
   77
   78:- set_prolog_flag(do_nautifier,false).   79
   80enable_nautifiers:- enable_in_file(do_nautifier).
   81disable_nautifiers:- disable_in_file(do_nautifier).
   82
   83
   84:- if(true).   85% some tests
   86
   87:- endif.