Ocaml (inclusion de liste dans une liste)

Résolu
Kel -  
 Kel -
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

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    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
  2. Kel
     
    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
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      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
    2. Kel
       
      -> 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
  3. KX Messages postés 19031 Statut Modérateur 3 020
     
    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
  4. Kel
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. KX Messages postés 19031 Statut Modérateur 3 020
     
    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
    1. Kel
       
      merci :)
      0