fix cases where you get repeated keys or a(X,X) keys in PFL.

This commit is contained in:
Vitor Santos Costa 2013-01-09 18:22:01 +00:00
parent 46fbc539bf
commit 6cee85bd60
2 changed files with 10 additions and 6 deletions

View File

@ -44,7 +44,7 @@ call_horus_lifted_solver(QueryVars, AllVars, Output) :-
init_horus_lifted_solver(_, AllVars, _, state(Network, DistIds)) :- init_horus_lifted_solver(_, AllVars, _, state(Network, DistIds)) :-
get_parfactors(Parfactors), get_parfactors(Parfactors),
get_observed_keys(AllVars, ObservedKeys), get_observed_keys(AllVars, ObservedKeys),
%writeln(network:(parfactors=Parfactors, evidence=ObservedKeys)), nl, % writeln(network:(parfactors=Parfactors, evidence=ObservedKeys)), nl,
cpp_create_lifted_network(Parfactors, ObservedKeys, Network), cpp_create_lifted_network(Parfactors, ObservedKeys, Network),
maplist(get_dist_id, Parfactors, DistIds0), maplist(get_dist_id, Parfactors, DistIds0),
sort(DistIds0, DistIds). sort(DistIds0, DistIds).
@ -74,7 +74,7 @@ is_factor(pf(Id, Ks, Rs, Phi, Tuples)) :-
maplist(get_range, Ks, Rs), maplist(get_range, Ks, Rs),
Table \= avg, Table \= avg,
gen_table(Table, Phi), gen_table(Table, Phi),
all_tuples(Constraints, Vs, Tuples). all_tuples(Constraints, Vs, Tuples).
get_range(K, Range) :- get_range(K, Range) :-
@ -87,7 +87,8 @@ gen_table(Table, Phi) :-
all_tuples(Constraints, Tuple, Tuples) :- all_tuples(Constraints, Tuple, Tuples) :-
setof(Tuple, Constraints^run(Constraints), Tuples). findall(Tuple, run(Constraints), Tuples0),
sort(Tuples0, Tuples).
run([]). run([]).

View File

@ -153,12 +153,15 @@ process_arg(Sk, Id, _I) -->
new_skolem(Sk,D) :- new_skolem(Sk,D) :-
copy_term(Sk, Sk1), copy_term(Sk, Sk1),
skolem(Sk1, D1), skolem(Sk1, D1),
Sk1 =@= Sk, functor(Sk1,N,A),
functor(Sk ,N,A),
!, !,
( D1 = D -> true ; throw(pfl(permission_error(redefining_domain(Sk),D:D1)))). ( D1 = D -> true ; throw(pfl(permission_error(redefining_domain(Sk),D:D1)))).
new_skolem(Sk,D) :- new_skolem(Sk,D) :-
interface_predicate(Sk), functor(Sk ,N,A),
assert(skolem(Sk, D)). functor(NSk ,N,A),
interface_predicate(NSk),
assert(skolem(NSk, D)).
interface_predicate(Sk) :- interface_predicate(Sk) :-
Sk =.. SKAs, Sk =.. SKAs,