Есть ли способ получить наборы элементов из транзакций эффективно с прологом?
Извините, что задаю этот вопрос, но с тех пор, как я запрограммировал его в Прологе, прошло много времени. Я думаю, что я привык к императивной парадигме.:-(
Я пытаюсь получить наборы элементов из отношения Пролог:
% transaction(Time, Client, Item)
transaction(1, 2, 10).
transaction(1, 2, 20).
transaction(2, 5, 90).
transaction(3, 2, 30).
transaction(4, 2, 40).
transaction(4, 2, 60).
transaction(4, 2, 70).
transaction(5, 4, 30).
transaction(5, 3, 30).
transaction(5, 3, 50).
transaction(5, 3, 70).
transaction(5, 1, 30).
transaction(6, 1, 90).
transaction(6, 4, 40).
transaction(6, 4, 70).
transaction(7, 4, 90).
% Transformation of transactions to Lists of items per Time per Client.
transaction2(Time, Client, List) :-
setof(Item, Time^Client^transaction(Time, Client, Item), List).
% Itemsets.
itemsets :-
transaction(Time, Client, _),
transaction2(Time, Client, List),
assert(init(List)).
% Main:
main(Itemsets) :-
itemsets,
setof(Basket, init(Basket), Itemsets),
retractall(init(Basket)).
Тогда, если я обращаюсь к main(X), я хотел бы получить:
X = [[10, 20], [30], [30, 50, 70], [40, 60, 70], [40, 70], [90]]
Я просто не могу найти правильный способ сделать это.
Если я могу получить указатель или небольшую помощь, я буду очень признателен.
Bests,
B.
2 ответа
Пытаться
itemsets(L):-
setof(Items,
Time^Client^Item^Nil^(
transaction(Time, Client, Nil),
setof(Item, transaction(Time, Client, Item), Items)
), L).
и просто вызовите наборы элементов (Itemsets).
main(Items) :-
findsetof([T1,C1],transaction(T1,C1,_),L1),
findsetof(L2,(
append(_,[[T2,C2]|_],L1),
findsetof(Item,transaction(T2,C2,Item),L2)),
Items).
findsetof(A,B,L) :-
findall(A,B,C),
setof(A,member(A,C),L).