2011-05-13 2 views
0

Je pense que cette question doit être résolue :))trouver variables exacte dans la liste tho sur Prolog

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

concert(tmegadeth, [volker, rachel]). 

concert(ssoad, [kurt, rachel]). 

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

Je veux mettre en œuvre le audiance prédicat (L1, L2). retourne la liste de toutes les personnes (L2) qui ont regardé tous les concerts en L1. Les listes L1 et L2 ne doivent contenir aucun doublon.

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

Ceci est très difficile pour moi. Mais je pense que si je sais comment le faire, je n'aurais aucun problème avec prolog :)))

+1

Est-ce que ce travail est fait? –

Répondre

0

Pour éviter la duplication, d'abord vous pouvez extraire tous les artistes de la base de données de la clause et trouver des audiences correspondantes pour un ensemble spécifique de interprètes. Une solution pourrait être la suivante:

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

Merci beaucoup. Votre code est tout à fait correct. Et m'a donné beaucoup de façons de comprendre une question. Cependant je pense qu'il y a un problème. Vous faites des sous-ensembles de personnes comme [jack], [jack, volker] etc. Cependant, cela peut être donné comme public (X, [volker, jack]). Par conséquent, il ne peut pas trouver la liste en raison de la commande. Comment puis-je le réparer? – prologSolver

+0

Vous pourriez mettre à jour la dernière clause pour ajouter le permutation/2 prédicat pour la variable Y, cela résoudrait ce problème. – pad

+0

Je vois ce que tu veux dire. Mais cette fois, le programme essaie chaque permutation. :(Je ne pouvais pas résoudre malheureusement: (( – prologSolver