我认为这个问题必须解决:))
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没有任何问题:)))
答案 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).