2%:- mpred_unload_file.
    3:- set_fileAssertMt(baseKB).    4% ensure this file does not get unloaded with mpred_reset
    5:- prolog_load_context(file,F), ain(mpred_unload_option(F,never)).    6
    7% asserting mpred_sv(p,2) causes p/2 to be treated as a mpred_sv, i.e.
    8% if p(foo,1)) is a fact and we assert_db p(foo,2), then the forrmer assertion
    9% is retracted.
   10% prologSingleValued(Pred)
   11:- kb_global(baseKB:mpred_sv/2).   12arity(mpred_sv,2).
   13mpred_sv(Pred,Arity)==> arity(Pred,Arity),hybrid_support(Pred,Arity),singleValuedInArg(Pred,Arity).
   14
   15:- dynamic(mpred_sv_shared/2).   16mpred_sv_shared(Pred,Arity)==>({kb_shared(Pred/Arity)},mpred_sv(Pred,Arity)).
   17mpred_sv_shared(mpred_sv,2).
   18mpred_sv_shared(singleValuedInArg,2).
   19mpred_sv_shared(singleValuedInArgDefault,3).
   20
   21( prologSingleValued(Pred), arity(Pred,Arity)/ ( \+ singleValuedInArg(Pred,_)))
   22   ==> singleValuedInArg(Pred,Arity).
   23
   24%( \+ singleValuedInArg(Pred,_), prologSingleValued(Pred), arity(Pred,Arity)) 
   25%   ==> singleValuedInArg(Pred,Arity).
   26
   27% THIS HAS A BUG!?!
   28%( prologSingleValued(Pred), arity(Pred,Arity), \+ singleValuedInArg(Pred,_))
   29%   ==> singleValuedInArg(Pred,Arity).
   30
   31
   32% prologSingleValued(Pred),arity(Pred,Arity) ==> hybrid_support(Pred,Arity).
   33% mdefault(((prologSingleValued(Pred),arity(Pred,Arity))==> singleValuedInArg(Pred,Arity))).
   34% singleValuedInArg(singleValuedInArg,2).
   35
   36% TODO might we say this?
   37% Not really due to not every SingleValued pred have a cardinatity of 1 .. some might have no instances
   38% ((singleValuedInArg(Pred,N)/ ( \+ singleValuedInArgDefault(Pred,N,_))) ==> singleValuedInArgDefault(Pred,N,isMissing)).
   39
   40
   41arity(singleValuedInArgDefault, 3).
   42prologHybrid(singleValuedInArgDefault(prologSingleValued,ftInt,ftTerm)).
   43singleValuedInArg(singleValuedInArgDefault,3).
   44
   45(singleValuedInArg(Pred,_)==>prologSingleValued(Pred)).
   46
   47((singleValuedInArgDefault(SingleValued,ArgN,S1)/ground(S1)) ==> singleValuedInArg(SingleValued,ArgN)).
   48
   49:- kb_shared(singleValuedInArgAX/3).   50
   51(singleValuedInArg(F, N),arity(F,A)) ==> singleValuedInArgAX(F,A,N).
   52
   53%:- rtrace.
   54((singleValuedInArgAX(F,A,N), 
   55   {functor(P,F,A),arg(N,P,P_SLOT),replace_arg(P,N,Q_SLOT,Q)})
   56       ==> 
   57  ((( P,{P_SLOT\=isMissing, 
   58        call(dif:dif(Q_SLOT,P_SLOT)),call_u(Q),ground(Q)},Q)
   59        ==> (\+ Q, P)))).
   60%:- notrace,break.
   61
   62unused ==> 
   63((singleValuedInArgAX(F,A,N), 
   64   {functor(P,F,A),arg(N,P,P_SLOT),replace_arg(P,N,Q_SLOT,Q)})
   65       ==> 
   66  (( P/ground(P) ==> 
   67        ({P_SLOT\==isMissing,call(dif:dif(Q_SLOT,P_SLOT) ),
   68          call_u(Q),ground(Q),ignore(retract(Q))})))).
   69
   70unused ==> ((singleValuedInArgAX_maybe(F,A,N), 
   71   {functor(P,F,A),arg(N,P,P_SLOT),replace_arg(P,N,Q_SLOT,Q)})
   72       ==> 
   73  (( P/ground(P) ==> 
   74        ({P_SLOT\==isMissing,call(dif:dif(Q_SLOT,P_SLOT)),
   75          call_u(Q),ground(Q)}, (\+ Q, P, single_override_maybe(P,Q)))))).
   76
   77((single_override(P,Q), {ignore(retract(Q))})