在prolog上的列表中找到确切的变量

时间:2011-05-13 14:52:01

标签: list prolog

我认为这个问题必须解决:))

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

concert(tmegadeth, [volker, rachel]).

concert(ssoad, [kurt, rachel]).

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

我想实现谓词听觉(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 :(得分: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).