2011-05-05 114 views
0

我很抱歉问这个问题,但自从我在Prolog中编程以来已经很多了。我认为我习惯于强制性的范式。 :-(有没有一种方法可以有效地与事先获得项目集?

我试图获得项目集从Prolog的关系:

% 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)). 

然后,如果我请教主(X)我想获得:

X = [[10, 20], [30], [30, 50, 70], [40, 60, 70], [40, 70], [90]] 

我只是不能找出正确的做法

如果我能得到一个指针或一点帮助,我将非常感激

最好成绩,

B.

回答

2

尝试

itemsets(L):- 
    setof(Items, 
    Time^Client^Item^Nil^(
    transaction(Time, Client, Nil), 
    setof(Item, transaction(Time, Client, Item), Items) 
    ), L). 

并调用项集(项集)。

+0

嗨!非常感谢你!它马上工作。我可以在哪里了解关于setof和Nil的更多信息?我一直在阅读SWI Prolog和XSB手册以了解更好的集合,但我认为我需要用例子进行更深入的解释。谷歌没有得到帮助。也许我没有使用正确的关键字... – 2011-05-05 21:25:06

+0

寻找bagof/3也。没有太多的信息,但我想你会学习尝试一些例子。 – gusbro 2011-05-05 21:38:23

+0

+1到gusbro。 @B。 Solano:在[* LPN *](http://cs.union.edu/~striegnk/learn-prolog-now/html/node97.html#subsec.l11.bagof)上阅读'bagof/3'部分,然后是'setof/3'上的下一节。 – 2011-05-06 08:58:30

0

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). 
+0

嗨。非常感谢您的回答。我会去gusbro的方式。 ;-) – 2011-05-06 02:06:07

相关问题