% =====================================================
% File: sanity_tests.pl
% =====================================================

:- use_module(library(multivar)).
:- use_module(library(pfc_lib)).

isa(i1,c1).
predicate_function_canonical(isa,instanceOf).

% weaken_goals/2 that converts arguments (from legacy code)
% into metaterms which allow logical constraints to be placed upon unification
% in the case of atoms, they are "weakened" to non ground terms
predicate_hold_aliases(Spec),{mpred_functor(Spec,F,A),functor(P,F,A)} 
  ==> (  P, { weaken_goal(P,Q) } ==> {ignore(call(retract,P))},Q ).
       
predicate_hold_aliases(loves/2).

% the predicate is weakened on read (all args)
loves(sue,joe).
loves(joe,fred).

/*
?- loves(X,joe).
X = _{ '$value'= X, iz = sue}.
*/

% so that one may use "typed unification"
tFemale(sue).
~tFemale(joe).

/*
?-  use_module(library(attvar_reader)).  % allows attvars to be read from files and console

?- loves( X{iza=tFemale},joe).
X = _{ '$value'= X, iz = sue, iza=[tFemale]}.
Yes.

?- loves( sue, Y{iza=tFemale}).
Y = _{ '$value'= X, iz = fred}.
Yes.

% this was Joe was asserted to specifically not to be a tFemale.
% However the gender of Fred is still unknown

*/

:- if(false).

%  @TODO  Move this to a different set of exmaples
% this gets hairy to the instances can belong to several intensional types, extensional collections and datatypes.
:- ensure_loaded(library('logicmoo/pfc/user_transitiveViaArg.pfc')).
% both arguments must have at least some type attributes in common
meta_argtypes(loves(X,X)).  % 


:- endif.

% =====================================================
end_of_file.
% =====================================================



?- p(X,X) = p(i1,instanceOf(c1)).

X = _{ '$value'= X, iz = c1, iza=[c1]}.
Yes

?- use_module(clause_attvars).

?- p(X,X) = p(i1,instanceOf(c1)), asserta(x_was(X)).

?- 


