MLN generative learning
This commit is contained in:
@@ -4,14 +4,17 @@
|
||||
mln_domain/1,
|
||||
mln_literal/1,
|
||||
mln/1,
|
||||
mln/4,
|
||||
mln_w/2]).
|
||||
mln/5,
|
||||
mln_w/2,
|
||||
portray_mln/0,
|
||||
portray_mln/1]).
|
||||
|
||||
:- use_module(library(pfl)).
|
||||
:- use_module(library(maplist)).
|
||||
:- use_module(library(lists)).
|
||||
:- use_module(library(terms)).
|
||||
|
||||
:- dynamic mln/1, mln/2, mln_domain/4, mln/4, mln_w/2, mln_domain/5, mln_type_def/1.
|
||||
:- dynamic mln/1, mln/2, mln_domain/4, mln/5, mln_w/2, mln_domain/5, mln_type_def/1.
|
||||
|
||||
user:term_expansion(mln_domain(P),[]) :-
|
||||
expand_domain(P).
|
||||
@@ -84,10 +87,22 @@ translate_to_factor(W, D, Lits, Id, Vs, Phi, Domain) :-
|
||||
new_mln(Id),
|
||||
maplist(new_skolem(Id), Lits),
|
||||
term_variables(Lits, Vs),
|
||||
create_domain(Lits, Domain),
|
||||
create_domain(Lits, Domain0),
|
||||
exclude(ground, Domain0, Domain),
|
||||
make_clause(Id, Do, Vs, Domain, Lits, LP, Head),
|
||||
assert(mln_w(Id, W)),
|
||||
assert(mln(Id, Do, LP, Head)).
|
||||
assert(mln_w(Id, W)),
|
||||
find_pos(LP, NLP, Pos),
|
||||
foldl2(merge_domain_lits, Domain, NDomain, [], _, NLP, [] ),
|
||||
exclude(empty_goal, [true-Pos|NDomain], FDomain),
|
||||
assert(mln(Id, Do, LP, Head, FDomain)).
|
||||
|
||||
empty_goal(_-[]).
|
||||
|
||||
find_pos([], [], []).
|
||||
find_pos([-Lit|Lits], LP, [Lit|Pos]) :- !,
|
||||
find_pos(Lits, LP, Pos).
|
||||
find_pos([Lit|Lits], [Lit|LP], Pos) :-
|
||||
find_pos(Lits, LP, Pos).
|
||||
|
||||
%
|
||||
% naive translation of conj/disjunction into Prolog
|
||||
@@ -101,7 +116,7 @@ make_clause(Id, Do, Vs, Domain, _Lits, Fs, Head) :-
|
||||
order_body(disj, Fs, Bd0) :-
|
||||
order_body(Fs, Bd0).
|
||||
order_body(conj, Fs, Bd0) :-
|
||||
andder_body(Fs, Bd0),
|
||||
ander_body(Fs, Bd0),
|
||||
|
||||
|
||||
order_body([-G], (\+ G)).
|
||||
@@ -133,6 +148,23 @@ new_mln(Id) :-
|
||||
Id1 is Id+1,
|
||||
assert(mln(Id1)).
|
||||
|
||||
merge_domain_lits( Domain, Domain-Gs, Vs, [V|Vs], LP0, LPF) :-
|
||||
arg(1, Domain, V),
|
||||
delete_with_v(LP0, [V|Vs], LPF, Gs).
|
||||
|
||||
delete_with_v([], _Vs, [], []).
|
||||
delete_with_v([G|LP0], Vs, LPF, NGs) :-
|
||||
new_variables_in_term(Vs, G, NVs),
|
||||
( NVs == [] ->
|
||||
NGs = [G|Gs],
|
||||
LPF = LP1
|
||||
;
|
||||
NGs = Gs,
|
||||
LPF = [G|LP1]
|
||||
),
|
||||
delete_with_v(LP0, Vs, LP1, Gs).
|
||||
|
||||
|
||||
%
|
||||
% make it easier to manipulate
|
||||
%
|
||||
@@ -284,7 +316,7 @@ clean_cnf(CNF, NCNF) :-
|
||||
% count groundings
|
||||
%
|
||||
all_true(Id, V) :-
|
||||
mln(Id, _F, _D, Head),
|
||||
mln(Id, _F, _D, Head, _),
|
||||
nb_create_accumulator(0, Acc),
|
||||
(
|
||||
call(user:Head),
|
||||
@@ -294,3 +326,29 @@ all_true(Id, V) :-
|
||||
nb_accumulator_value(Acc, V)
|
||||
).
|
||||
|
||||
portray_mln :-
|
||||
portray_mln( user_error ).
|
||||
|
||||
portray_mln(Stream) :-
|
||||
mln(Id, _, LP, _, _),
|
||||
mln_w(Id, W),
|
||||
format(Stream, 'mln ~4f : ( ', [W] ),
|
||||
numbervars(LP, 1, _),
|
||||
portray_lits(Stream, LP),
|
||||
format(Stream, ' ).~n', [] ),
|
||||
fail.
|
||||
portray_mln(_Stream).
|
||||
|
||||
portray_lits(Stream, [L1]) :- !,
|
||||
portray_lit( Stream, L1 ).
|
||||
portray_lits(Stream, [L1|Ls]) :- !,
|
||||
portray_lit( Stream, L1 ),
|
||||
format(Stream, ' ; ', []),
|
||||
portray_lits( Stream, Ls ).
|
||||
|
||||
portray_lit( Stream, -L ) :- !,
|
||||
format( Stream, '\\+ ~q', [L] ).
|
||||
portray_lit( Stream, L ) :-
|
||||
format( Stream, '~q', [L] ).
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user