【问题标题】:Is there a way of obtaining itemsets from transactions efficiently witho prolog?有没有一种方法可以在没有序言的情况下有效地从事务中获取项目集?
【发布时间】:2011-05-05 19:51:29
【问题描述】:

很抱歉问这个问题,但自从我在 Prolog 中编程以来已经有很多了。我想我习惯了命令式范式。 :-(

我正在尝试从 Prolog 关系中获取 itemset

% 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]]

我只是想不出一个正确的方法。

如果我能得到指点或一点帮助,我将不胜感激。

最佳,

B.

【问题讨论】:

    标签: prolog prolog-setof


    【解决方案1】:

    试试

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

    然后调用项目集(Itemsets)。

    【讨论】:

    • 嗨!非常感谢!它立即起作用。我在哪里可以了解有关 setof 和 Nil 的更多信息?我一直在阅读 SWI Prolog 和 XSB 手册以更好地理解 setof,但我认为我需要通过示例进行更深入的解释。谷歌没有帮助。也许我没有使用正确的关键字...
    • 也寻找 bagof/3。信息不多,但我想你会尝试一些例子来学习。
    • +1 给古斯布罗。 @B。 Solano:阅读bagof/3LPN 的部分,然后阅读setof/3 的下一部分。
    【解决方案2】:
    
    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).
    

    【讨论】:

    • 嗨。非常感谢您的回答。我会去古斯布罗的方式。 ;-)
    猜你喜欢
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 2018-12-25
    • 2010-09-18
    • 1970-01-01
    • 2011-06-04
    相关资源
    最近更新 更多