bonjour,
je cherche comment résoudre ce probleme avec swi prolog:
j'ai une liste triée comme ca [5,6,7,7,8,9,9,9] et je veux avoir en sortie une liste de cette sorte [5,6,[7,7],8,[9,9,9]] cad mettre les entiers egaux dans une liste.
Merci
bonjour,
je cherche comment résoudre ce probleme avec swi prolog:
j'ai une liste triée comme ca [5,6,7,7,8,9,9,9] et je veux avoir en sortie une liste de cette sorte [5,6,[7,7],8,[9,9,9]] cad mettre les entiers egaux dans une liste.
Merci
Et quel est ton problème? As-tu déjà écrit quelque chose? Ou tu ne vois pas du tout comment faire ça?
J'ai bien une solution, mais en utilisant le prédicat atomic(X) ou is_list(X) donc ce n'est pas très élégant.
La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
Donald E. Knuth
un début de tentative , j'extrait E1 et E2 de la liste, il reste R, Q est le résultat :
mais je "cale" pour généraliser, et c'est pas trop déclaratif.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 ?- [1,2,3,3,4,5]=..[_,E1,List|_], List =[E2|R],( E1 = E2 -> Q=[E1,E2]; Q=E1). E1 = 1, List = [2, 3, 3, 4, 5], E2 = 2, R = [3, 3, 4, 5], Q = 1. ?- [1,1,3,3,4,5]=..[_,E1,List|_], List =[E2|R],( E1 = E2 -> Q=[E1,E2]; Q=E1). E1 = 1, List = [1, 3, 3, 4, 5], E2 = 1, R = [3, 3, 4, 5], Q = [1, 1].
"En m'inspirant fortement" d'une des solutions de l'énoncé 09 sur les "99 problems of lisp" :
j'aurais aimé ne pas créer la règle raccourcir afin de ne pas scruter la liste L, mais la règle paquet ne fonctionne que sur des listes car il aurait fallu traiter des cas particuliers ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 % le paquet d'une liste vide c'est vide paquet([],[]). %le paquet X est [X] paquet([X], [[X]]). % le paquet si les elements se repetent paquet([X|Y], [[X,X|Y1]|Z1]) :- paquet(Y, [[X|Y1]|Z1]). % le paquet si les elements sont differents paquet([X|Y], [[X],[X1|Y1]|Z1]) :- paquet(Y, [[X1|Y1]|Z1]), X \== X1. % le paquet minimun est une paire [X] que je raccourcis en X % pour une longueur de [X] > 1 je garde tel que. raccourcir([],[]). raccourcir([X|L],[T|R]):- length(X,V), ( V = 1 -> X=[T] ; T=X ), raccourcir(L,R). % la demande Li = liste en analyse et Lo = la réponse. paqueter(Li,Lo) :- paquet(Li,L),raccourcir(L,Lo).
une idée
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager