2011-05-13 52 views
0

我認爲這個問題必須得到解決:))找到確切的變量壽名單序言

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];... 

這對我來說很難。但我認爲如果我知道如何去做,我就不會遇到任何序言:))

+1

這個功課是? – 2011-05-13 14:53:47

回答

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 2011-05-13 15:56:24

+0

您可以更新最後一個子句來爲變量Y添加置換/ 2謂詞,它可以解決該問題。 – pad 2011-05-13 16:20:19

+0

我明白你的意思了。但是這一次,程序正在嘗試每一個排列。 :(我無法解決不幸:(( – prologSolver 2011-05-15 00:03:15