2011-05-13 4 views
0

나는이 문제를 해결해야한다고 생각한다.))프롤로그에서 tho 목록의 정확한 변수 찾기

concert(dtatu, [jack, volker, rachel]). 

concert(tmegadeth, [volker, rachel]). 

concert(ssoad, [kurt, rachel]). 

concert(trbeyonce, [kurt,jack,volker]). 

나는 술어 audiance (L1, L2)를 구현하고 싶다. L1에있는 모든 콘서트를 본 모든 사람들 (L2)의 목록을 반환합니다. 목록 L1과 L2는 중복을 포함해서는 안됩니다.

audiance([tatu,beyonce],X). returns X=[jack,volker] 

audiance(X,[volker,rachel]). returns X=[tatu,megadeth] 

audiance(X,[kurt,volker,rachel]) 

audiance([tatu, beyonce],[jack, volker]) returns true 

audiance(X,Y). returns X=[tatu], Y=[jack, volker, rachel]; X=[megadeth, soad], Y=[rachel];... 

이것은 매우 어렵습니다. 그러나 나는 그것을 어떻게 할지를 안다면, 나는 prolog에 아무런 문제가 없을 것이라고 생각한다 :)))

+1

이 숙제입니까? –

답변

0

중복을 피하기 위해 먼저 절 데이터베이스에서 모든 출연자를 추출하고 특정 모음 연기자. 해결책은 다음과 같습니다.

subset([], []). 
subset(Xs, [_|Ys]) :- subset(Xs, Ys). 
subset([X|Xs], [X|Ys]) :- subset(Xs, Ys). 

allPerformers(Ts) :- findall(T, concert(T, _), Ts). 
performers(T) :- allPerformers(Ts), subset(T, Ts). 

audience1([T], L) :- concert(T, L). 
audience1([T|Ts], L) :- concert(T, L0), audience1(Ts, L1), intersection(L0, L1, L). 

audience(X, Y) :- performers(X), audience1(X, Y). 
+0

고맙습니다. 당신의 코드는 옳다. 그리고 질문을 제기하는 방법을 많이 알려주었습니다. 그러나 나는 거기에 문제가 있다고 생각한다. [jack], [jack, volker] 등과 같은 사람들의 하위 집합을 만들고 있습니다. 그러나 관객 (X, [volker, jack])처럼 제공 할 수 있습니다. 따라서 주문 때문에 목록을 찾을 수 없습니다. 어떻게 해결할 수 있습니까 ?? – prologSolver

+0

변수 Y에 대한 순열/2 술어를 추가하기 위해 마지막 절을 업데이트 할 수 있습니다. 그러면이 문제를 해결할 수 있습니다. – pad

+0

무슨 뜻인지 알 겠어. 그러나 이번에는 프로그램이 모든 순열을 시도하고 있습니다. :(나는 unfortunatelly를 해결할 수 없었다 : (( – prologSolver