Did you know ... Search Documentation:
Pack logicmoo_utils -- prolog/multivar/README.md

Multivars

This library provides Prolog interface to DMiles' expermental C code for SWI-Prolog

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

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

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)).

?-