2009-12-10 3 views
-1

Comment puis-je écrire une relation dans prologue qui détermine s'il y a deux paires dans une liste avec la même somme. La relation devrait échouer s'il n'existe pas de paires dont les sommes sont égales. La relation doit également échouer si la liste contient moins de quatre éléments.programme prologue pour déterminer si deux paires d'une liste ont la même somme

  • liste ([1 2 3]) échoue, car il a seulement 3 éléments
  • liste
  • ([2 3 4 1]) réussit depuis 2 + 3 = 4 + 1
  • liste
  • ([3 1 2 4 5 6]) succeds depuis 5 + 1 = 2 + 4
  • liste ([1 8 20 100]) échoue car il n'y a pas de paires avec des sommes égales
+0

S'il vous plaît essayer d'écrire cette question plus clairement. Voulez-vous dire que vous voulez savoir s'il y a * deux * paires dans la liste avec la même somme? – Eric

+1

Hrrm ... es-tu aussi dans CSC388? Peut-être que je devrais le dire ... :) –

+0

Pourriez-vous être clarifié dans votre explication? –

Répondre

2

Souhaitez-vous cet algorithme: prendre deux quelconques paires de nombres, et voir si elles correspondent. Voici le code correspondant:

has_equal_sums(List) :- 
    select(A, List, List2), 
    select(B, List2, List3), 
    select(C, List3, List4), 
    select(D, List4, _), 
    A+B =:= C+D. 

Si vous voulez vous assurer qu'il fonctionne, ou à des fins de débogage, vous pouvez afficher les deux paires sélectionnées en sortie:

has_equal_sums(List, [[A, B], [C, D]]) :- 
    select(A, List, List2), 
    select(B, List2, List3), 
    select(C, List3, List4), 
    select(D, List4, _), 
    A+B =:= C+D. 

Voici quelques-unes exemples d'utilisation:

?- has_equal_sums([1, 2, 3, 6, 5], X). 
X = [[1,6],[2,5]] ? ; 
X = [[2,6],[3,5]] ? 

?- has_equal_sums([1, 2, 3, 5], X). 
no 

?- has_equal_sums([1, 2, 3], X). 
no 
+0

Je ne suis pas l'affiche, mais je connais l'exigence. Une partie des instructions indique que vous devez être capable de gérer une liste de longueur variable. Ainsi, l'algorithme doit non seulement faire les comparaisons de quatre éléments de la liste dans chacune des trois combinaisons possibles, mais doit également implémenter une certaine logique pour vérifier a) la liste est trop courte b) la récursion de queue pour vérifier une sous-liste. –

+0

Salut Jerome Merci pour votre message.Mais je veux une relation en prologue s'il y a deux paires dans la liste avec la même somme et la relation échoue s'il n'y a pas de paires dont les sommes sont égales.La relation échoue également si la liste contient moins de quatre éléments. – nan

+2

Il semble que la réponse de Jérôme fasse toutes ces choses correctement (et son édition démontre certains des cas qui sont mentionnés). Pour comprendre pourquoi, pensez à ce que les appels ultérieurs à Select/3 feront si la liste originale est trop courte, et à la façon dont ils vont travailler avec le retour arrière pour des valeurs plus profondes dans une longue liste. – Eric

2

Alors j'ai vérifié avec mon professeur et depuis notre date limite est passée, il est OK avec moi mon affichage solution à ce problème. Ceci est sans doute pas la manière la plus succincte pour résoudre le problème, et je me penche sur mon schéma un peu, mais il semble fonctionner:

%car operations 
    car([],null). 
    car([X|_],X). 
    cadr([_|L],R) :- 
    car(L,R). 
    caddr([_|L],R) :- 
    cadr(L,R). 

%cdr operations 
    cdr([],[]). 
    cdr([_|L],L). 
    cddr([_|L],R) :- 
    cdr(L,R). 
cdddr([_|L],R) :- 
    cddr(L,R). 

%two-pair operation 
% This algorithm is based on the provided example 
% solution for CSC388FA09HW4. 
long-enough(L,_) :- 
    length(L,X), 
    X>3. 
too-long(L,_) :- 
    length(L,X), 
    X>4. 
two-pair([Head|Tail]) :- 
    long-enough([Head|Tail],_), 
    (
     (car(Tail,N2),cadr(Tail,N3),caddr(Tail,N4),Head+N2=:=N3+N4); 
     (cadr(Tail,N2),car(Tail,N3),caddr(Tail,N4),Head+N2=:=N3+N4); 
     (caddr(Tail,N2),car(Tail,N3),cadr(Tail,N4),Head+N2=:=N3+N4) 
    ); 
    too-long([Head|Tail],_), 
    (
     two-pair(Tail); 
     cdr(Tail,N2),two-pair([Head|N2]); 
     car(Tail,N2),cddr(Tail,N3),two-pair([Head|[N2|N3]]); 
     car(Tail,N2),cadr(Tail,N3),cdddr(Tail,N4),two-pair([Head|[N2|[N3|N4]]])). 
+1

Si vous voulez que ce soit plus utile aux gens, il serait bon d'ajouter quelques commentaires. Ensuite, si vous regardez ce code dans 5 ans, vous n'aurez pas à réfléchir trop fort pour le comprendre à nouveau ... –

Questions connexes