2011-05-05 2 views
0

이 질문에 대해 유감스럽게 생각합니다. 그러나 Prolog에서 프로그래밍 한 이후로 많은 도움이되었습니다. 나는 필사적 패러다임에 익숙하다고 생각합니다. :-(나는 프롤로그 관계에서 itemsets 얻기 위해 노력하고트랜잭션에서 효율적으로 프롤로그를 사용하여 항목 세트를 얻는 방법이 있습니까?

: 나는 주 (X)를 참조하면 내가 얻을 싶은 그런

% 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 = [[10, 20], [30], [30, 50, 70], [40, 60, 70], [40, 70], [90]] 

난 그냥 이 작업을 수행하는 올바른 방법을 알아낼 수 없습니다.

012 3,516,

Bests,

B.

답변

2

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

그냥 전화 itemsets (Itemsets)를보십시오.

+0

안녕하세요! 고마워요! 바로 작동했습니다. setof와 Nil에 대해 더 자세히 알 수있는 곳은 어디입니까? 나는 더 나은 setof를 이해하기 위해 SWI Prolog와 XSB 매뉴얼을 읽었지 만, 나는 예제들에 대해 더 깊은 설명이 필요하다고 생각한다. Google은 도움이되지 않았습니다. 어쩌면 나는 적당한 키워드를 사용하고 있지 않다 ... –

+0

bagof/3를 찾으십시오. 많은 정보는 없지만 몇 가지 예를 배우는 법을 배울 것입니다. – gusbro

+0

+1 to gusbro. @비. 솔라노 : [* LPN *] (http://cs.union.edu/~striegnk/learn-prolog-now/html/node97.html#subsec.l11.bagof)에서 'bagof/3' 섹션을 읽고, 'setof/3'의 다음 절. –

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

안녕하세요. 대답 해 주셔서 감사합니다. 나는 거스 브로 길을 갈거야. ;-) –

관련 문제