Ocaml (inclusion de liste dans une liste)
Résolu/Fermé
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 .
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 .
A voir également:
- Ocaml list
- List disk - Guide
- Directory list & print - Télécharger - Divers Utilitaires
- Zn-401s code list - Forum Téléviseurs
- Skribbl.io word list french ✓ - Forum Windows
- Rm-014s+ code list - Forum Téléviseurs
5 réponses
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
6 mai 2011 à 13:07
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
Avec le typage fort d'OCaml il est immédiat de différencier une 'a list et une 'a list list
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 .
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 .
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
Modifié par KX le 6/05/2011 à 14:02
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 ;)
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 ;)
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
6 mai 2011 à 14:33
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.
Remarque : le deuxième cas arrive lorsque l'ensemble2 est plus petit que l'ensemble1
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
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
;;
ç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
;;
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
6 mai 2011 à 17:20
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 ;-)
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);;