Ocaml (inclusion de liste dans une liste)

Résolu/Fermé
Kel - 6 mai 2011 à 12:23
 Kel - 6 mai 2011 à 18:30
Bonjour,

J'ai essayé de faire une fonction qui test l'inclusion d'une liste dans une autre liste et j'y arrive pas . Si quelqu'un peu m'aider ça serait gentil .


Merci d'avance .

5 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
6 mai 2011 à 13:07
C'est pas clair ta question...
Avec le typage fort d'OCaml il est immédiat de différencier une 'a list et une 'a list list
0
merci d'avoir répondu ,

Voilà j'essai de résoudre un exercice qui demander d'érire une fonction inclus liste1 liste2 qui teste l'inclusion d'une liste dans une autre liste.
Par exemple : le liste [1;3;1] est inclus dans [1;3;3;1] et [3;1;1] et n'est pas inclus dans [1;3] ni dans [1;3;2]

#inclus [1;3;1] [1;3;3;1] = true

J'espère que c'est claire .
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 6/05/2011 à 14:02
Non ce n'est pas encore tout à fait clair ^^
C'est une sous-liste que tu veux ? auquel cas [1;3;1] ne devrait pas être inclus dans [1;3;3;1]
Ou alors tu veux savoir si les éléments de l'ensemble sont le deuxième peu importe l'ordre des éléments, mais auquel cas c'est pas du tout la même chose (presque plus simple même ;)
0
-> inclus liste1 liste2;
Je veux savoir si tous les éléments de liste1 sont dans liste2
par exemple [1;2;1] n'est pas dans la liste [1;2;3] parcequ'il y a le dernier élément "1 "de la liste1 qui n'appartient pas à la 2eme liste
Je sais pas très bien expliquer lol . Est ce que c'est un peu claire :s
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
6 mai 2011 à 14:33
Tu dois faire un traitement récursif (normal : c'est du Caml !)
Pour éviter toute ambiguïté, je vais dire que c'est des ensembles même si c'est toujours des éléments de type list pour OCaml.

Entrée :
	ensemble1
	ensemble2

Question :
	ensemble1 inclus dans ensemble2 ?

Cas terminaux :
	ensemble1 est vide --> Réponse = vrai
	ensemble2 est vide --> Réponse = faux

Remarque : le deuxième cas arrive lorsque l'ensemble2 est plus petit que l'ensemble1

Récursivité :
	on prend x1 le premier élément de ensemble1
	on parcours l'ensemble2 pour trouver x2=x1
	Si on a trouvé x2, on recommence avec ensemble1-x1 et ensemble2-x2
	Sinon (on a tout parcouru) --> Réponse = faux
0
Merci beaucoup ça m'a aidé ^_^
ça marche voici le code :

let rec supp e l = match l with
[]->[]
|x::xs-> if e= x then xs else x ::(supp e xs );;

let trouver e l = match l with
[]-> false
|x::xs -> if e = x then true else trouver xs ;;

let rec inclus l1 l2 = match l1 with
[]-> true
|x::xs-> if List.mem x l2 then inclus ( supp x l1) (supp x l2 ) else false
;;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
6 mai 2011 à 17:20
Tant mieux ^^
Juste deux petites erreurs pour trouver : tu as oublié rec, et le x dans trouver x xs;;

Pour info, voici ce que moi j'avais fait... Un peu plus compliqué, mais plus rapide surtout ;-)

let rec contient x r = function
	|[] -> false,r
	|y::e ->
		if y=x
		then (true,r@e)
		else contient x (y::r) e;;

let rec sousensemble = function
	|[],_ -> true
	|_,[] -> false
	|x::e1,e2 ->
		let (b,r) = contient x [] e2 in
		b && sousensemble (e1,r);;
0
merci :)
0