25
26:- module(vhar,
27 []). 28
29
30
31is_vhar(Var,Attrs):-attvar(Var),get_attr(Var,vhar,Attrs).
32vhar(Var):- vhar(Var,_Proxy,_Out,[vhar(Var)]).
33vhar(Var,Out):- vhar(Var,_Proxy,Out,[vhar(Var,Out)]).
34vhar(Var,Proxy,Out):-vhar(Var,Proxy,Out,[vhar(Var,Proxy,Out)]).
35vhar(Var,Proxy,Out,PrevGoals):-
36 (var(Out)->Out=the(Var);setarg(1,Out,Var)),put_attr(Var,vhar,vhar(Var,Proxy,Out,PrevGoals)),
37 gensym(vhar_,Serial),
38 vprox(Proxy,Serial,Var).
39
40
41vhar:attribute_goals(Var)-->{get_attr(Var,vhar,vhar(OrigVar,_Proxy,_Out,Goals))},({OrigVar==Var}->Goals;[]).
42
43vhar:attr_unify_hook(vhar(_VarI,ProxyI,OutI,_GoalsI),Value):- (Value==ProxyI;Value==OutI),!.
44vhar:attr_unify_hook(InfoI,Value):- is_vhar(Value,InfoO),!,
45 InfoI=vhar(VarI,ProxyI,OutI,GoalsI),InfoI=vhar(VarI,ProxyI,OutI,GoalsI),
46 InfoO=vhar(VarO,ProxyO,OutO,GoalsO),InfoO=vhar(VarO,ProxyO,OutO,GoalsO),
47 copy_term(ProxyI,ProxyI,ProxyGoalsI),subst(ProxyGoalsI,VarI,ProxyI,CorrectedGoalsI),
48 copy_term(ProxyO,ProxyO,ProxyGoalsO),subst(ProxyGoalsO,VarO,ProxyO,CorrectedGoalsO),
49 trace,maplist(call,CorrectedGoalsI),
50 trace,maplist(call,CorrectedGoalsO),
51 append(GoalsI,GoalsO,Goals),
52 list_to_set(Goals,GoalsSet),
53 setarg(4,InfoI,GoalsSet),
54 setarg(4,InfoO,GoalsSet).
55
56vhar:attr_unify_hook(InfoI,Value):- is_vhar(Value,InfoO),!,
57 InfoI=vhar(VarI,ProxyI,OutI,GoalsI),InfoI=vhar(VarI,ProxyI,OutI,GoalsI),
58 InfoO=vhar(VarO,ProxyO,OutO,GoalsO),InfoO=vhar(VarO,ProxyO,OutO,GoalsO),
59 copy_term(Value,VarI,ValueGoals),
60 61 62 63 subst(ValueGoals,VarI,VarO,ValueGoals2),
64 maplist(call,ValueGoals2),
65 append(GoalsI,GoalsO,Goals),
66 setarg(4,InfoI,Goals),
67 setarg(4,InfoO,Goals).
68
69vhar:attr_unify_hook(vhar(_Var,Proxy,Out,Goals),_Value):- vhar(Proxy,New,Goals),setarg(1,Out,New).
70
71:- fixup_exports.