% -- Deel 1
sluiting(Waar, Regels, Sluiting) :-
select(Cond >> Cons, Regels, RemainingRegels),
member2(Cond, Waar), !,
append(Waar, Cons, NewWaar0),
list_to_set(NewWaar0, NewWaar1),
sluiting(NewWaar1, RemainingRegels, Sluiting).
sluiting(X, _, X).
member2(L1, L2) :- intersection(L1, L2, L1).
% -- Deel 2
alleredundante(F, X) :-
findall(Pad,
(
select(Cond >> Cons, F, AndereRegels),
isredundant(Cond, AndereRegels, Cons, Pad0),
Pad = redundant(Cond >> Cons, Pad0)
),
List),
list_to_set(List, X).
isredundant(From, Regels, To, Pad) :-
select(Cond >> Cons, Regels, AndereRegels),
(
member2(To, Cons) ->
Pad = [Cond >> Cons],
From = Cond
;
isredundant(From0, AndereRegels, To, Pad0),
(
member2(From0, Cons) ->
Pad = [Cond >> Cons | Pad0],
From = Cond
;
Pad = Pad0,
From = From0
)
).