IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Prolog Discussion :

retour d'une liste en particulier


Sujet :

Prolog

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut retour d'une liste en particulier
    bonjour
    alors voilà j'ai un petit problème avec mon prédicat, je voudrais qu'il me renvoie la liste la plus longue de ma base de connaissance (exo typique des trains =/) mais j'avoue que là je suis un peu perdu .
    j'ai déjà fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    mot([1,2,3]).
    mot([1,2]).
    mot([1,2,3,4,5]).
    mot([1,2,3,4,5,6,7,8,9,10]).
     
    taille([],0).
    taille([T|L1],TAILLE) :- taille(L1,L), TAILLE is L+1.
     
    longest([], 0).
    longest(Lss, N) :- taille(Lss, L),L >= N.
    alors que je voudrais qu'il me renvoie :
    X = [1,2,3,4,5,6,7,8,9,10].

    merci pour votre aide

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je ne vois pas l'utilisation des faits mot dans les prédicats taille ni surtout longest !
    Quel Prolog utilisez-vous ? Pouvez-vous utiliser bagof ? length ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    j'utilise swipl, c'est juste que je n'arrive pas à définir mon prédicat longest qui me permettrait de renvoyer le wagon : mot(X) le plus long :/

    d'un coté je préfère ne pas utiliser les prédicats prédéfinis .

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Le problème est surtout de trouver un moyen de passer en revue tous les faits mot/1.
    Une possibilité est de créer un prédicat qui appelle mot/1 et qui se termine par fail. Ainsi tous les mots sont passés en revue, et pour récupérer le résultat dans un autre prédicat il faut écrire \+<le_predicat> (sinon le prédicat appelant échoue lui-même). Cela fonctionne en onjonction avec assert/retract.
    Je vous laisse chercher sur cette voie.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    édite , oui je vois le truc maintenant , ça sera nettement plus simple.
    L étant une liste mais comment faire pour qu'une fois toutes les permutations finies, test() s'arrête, et me mets à chaque permutation, e est mis dans ma bdc ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test(L,X) :- permutation(L,Ls),assert(mes_mots(e)).

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je pense qu'il faut à chaque étape retirer ce qui est mémorisé, comparer avec le mot courant, et remémoriser le mot le plus long.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    k ça va être un peu compliqué, je trouve.
    Je pensais à générer une nouvelle base de connaissance en effectuant des permutations sur la liste que je lui aurai passé en argument. Après c'est du gâteau vu que j'aurai une base de connaissance propre.

    Je me suis inspiré de ce que vous m'avez dit
    Une possibilité est de créer un prédicat qui appelle mot/1 et qui se termine par fail. Ainsi tous les mots sont passés en revue, et pour récupérer le résultat dans un autre prédicat
    , et cette solution est meilleure que celle que j'avais en tête.
    Parcontre comment faire pour qu'à chaque permutation, il crée une base de connaissance sans que l'on ai besoin d'appuyer sur ";", pour continuer la création. =/

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Il suffit d'ajouter fail.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    ok merci beaucoup, tiens effectivement, il y a des doublons :/
    il y aurai pas un moyen de les supprimer ?

  10. #10
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Bizarre qu'il y ait des doublons ?
    On peut voir le code ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    voici le code,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    test(L2) :- permutation(L2,L3),assert(mes_mtss(L3)),fail.
    d'un coté, je me dis que c'est un peu normal vu qu'il fait toutes les permutations, donc forcément il y a des permutations qui sont les même en l'occurrence :


  12. #12
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je ne pensais qu'il y avait 2 elements égaux dans la permutation de départ !
    Pour les suppriler il suffit de tester si elles existent déjà par un mes_mtss(L3) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    :- dynamic mes_mtss/1.
    test(L2) :-
    	permutation(L2,L3),
    	(   \+mes_mtss(L3) -> assert(mes_mtss(L3)); true),
    	fail.
    N.B. la première ligne est indispensable, sinon le test \+mes_mtss(L3) engendre une erreur
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    merci beaucoup

    je ne pensais pas qu'on pouvait pas utiliser "\+" et les "->"

    car dans le cours sur le site , j'avais pas très bien compris comment m'en servir

    je vais pouvoir mettre [RESOLU]

    merci encore et passez de bonne fêtes

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JAX-WS] Retour d'une liste
    Par Arnich dans le forum Services Web
    Réponses: 0
    Dernier message: 19/08/2011, 04h40
  2. Réponses: 11
    Dernier message: 07/08/2006, 10h14
  3. Réponses: 1
    Dernier message: 26/06/2006, 17h29
  4. affecter une liste à un retour de fonction
    Par irenee dans le forum ASP
    Réponses: 4
    Dernier message: 24/04/2006, 14h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo