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 :

[débutant] Prédicat : Suffixe et préfixe


Sujet :

Prolog

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    informatique
    Inscrit en
    Août 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2018
    Messages : 26
    Points : 32
    Points
    32
    Par défaut [débutant] Prédicat : Suffixe et préfixe
    Bonjour,

    Je suis débutant en Prolog. J'essaye de créer un prédicat pour obtenir le suffixe et le préfixe de la liste(X,l(a,l(b,0)))).
    De manière à obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    prefixe(P,l(a,l(b,0))). 
    P = 0; 
    P = l(a, 0); 
    P = l(a, l(b, 0)); 
    false.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    suffixe(S,l(a,l(b,0))). 
    S = l(a, l(b, 0));
    S = l(b, 0); 
    S = 0; 
    false.

    Voila ce que j'ai fait pour l'instant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    % Suffixe 
    suffixe(T,l(T,_)). 
    suffixe(X,l(_,Q)) :- suffixe(X,Q).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    % Prefixe
    prefixe(Q,l(_,Q)). 
    prefixe(X,l(_,Q)) :- prefixe(X,Q).
    .


    Mais j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    prefixe(S,l(a,l(b,0))).
    S = l(b, 0) ;
    S = 0 ;
    false.
    .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    suffixe(S,l(a,l(b,0))).
    S = a ;
    S = b ;
    false.
    Quelqu'un pourrait - il m'expliquer ce que j'ai fait de mal ?

  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
    Bonjour
    Un peu difficile pour un débutant.
    Première chose l(T,Q) n'est pas une liste mais un "compound term", peut-être "terme composé" en français.

    le code de suffixe est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    % Suffixe
    suffixe(X,l(T,Q)) :- X = l(T,Q) ; (Q =.. [l | _] -> suffixe(X,Q); X = Q).
    En gros qu'ai-je écris ?
    X = l(T,Q) ==> le suffixe de l(T,Q) c'est lui-même
    mais (introduit par le ';')
    si le terme Q se décompose à l'aide l'opérateur "univ" (=..) en une liste [l | _] (l suivi de quelque chose) on rappelle suffixe avec Q sinon le suffixe est Q.

    Je te laisse réfléchir à l'écriture de prefixe, un indice, prefixe est "l'inverse" de suffixe).
    Bon courage.
    "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
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 16
    Points : 24
    Points
    24
    Par défaut
    Bonjour Trap D,

    Je tiens à te remercier pour toutes tes précisions sur cet exercice. Je suis également concerné et je n'arrive pas à créer le prédicat préfixe et afficher le dernier élément de la liste.
    Nous disposons d'un cours très débutant qui n'aborde pas du tout ce type de liste l(a, l(b, 0)) mais plutôt des grands classiques de liste de type [a, b, c, d].

    Après de plusieurs recherches sur le web, je n'ai pas trouvé de ressources concernant la résolution de ce type d'exercice. Peux-tu m'aider ? sinon les étudiants concernés par cet exercice vont juste recevoir une note sans explication, ce qui est dommage en terme d'apprentissage

    Bonne journée.

  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
    Bonjour
    Pas terrible de déterrer un vieux sujet.
    Montre d'abord ce que tu as fait. Comme je le disais, préfixe est l'inverse de suffixe, alors ...
    "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
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 16
    Points : 24
    Points
    24
    Par défaut
    Je poste très rarement sur les forums. Je vais me mettre à la page concernant les règles à respecter.

    L'exercice demande :

    premier(X, L).X est le premier élément de la liste L.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ?* premier(X,l(a,l(b,l(c,0)))).
    X = a.
    J'ai réussi sans trop de mal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    premier(T,l(T,_)).
     
    dernier(X, L).
    X est le dernier élément de la liste L.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ?* dernier(X,l(a,l(b,l(c,0)))).
    X = c;
    J'ai voulu m'inspirer sur les seules données du cours que j'ai a disposition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dernier1([X],X).
    dernier1([_|L],X) :- dernier1(L,X).
    mais en vain :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dernier1(l(),X).
    dernier1(l(_|L),X)) :- dernier1(L,X).
    Cela ne donne rien.

    J'ai réussi à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    in(T,l(T,_)).
    in(X,l(_,Q)) :- in(X,Q).
    qui renvoie x =a, x =b, x= c.

    Cet exercice demande également préfixe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    prefixe(P,l(a,l(b,0))).
    P = 0 ;
    P = l(a, 0) ;
    P = l(a, l(b, 0)) ;
    J'ai essayé d'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    retourne([],[]).
    retourne([X|R],L1) :- retourne(R,R1),append(R1,[X],L1).
    mais la syntaxe est encore une fois pas adaptée.

    J'ai pensé à faire un not sur suffixe mais bon je préfère pas. C'est pas pédagogique.

    En fait, je ne trouve pas de méthode sur le web, ni dans mon cours. As-tu une solution ou un bouquin à me conseiller ?



    Citation Envoyé par Trap D Voir le message
    Bonjour
    Pas terrible de déterrer un vieux sujet.
    Montre d'abord ce que tu as fait. Comme je le disais, préfixe est l'inverse de suffixe, alors ...

  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
    Pour suffixe on a l'un ou l'autre, peut-être qu'en faisant l'autre ou l'un ...
    "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
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 16
    Points : 24
    Points
    24
    Par défaut
    Un grand merci de m'avoir aider mais hélas le préfixe n'est pas l'inverse du suffixe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ?* prefixe(P,l(a,l(b,0))).
    P = 0 ;
    P = l(a, 0) ;
    P = l(a, l(b, 0)) 
    ;false.
     
     
    ?* suffixe(S,l(a,l(b,0))).
    S = l(a, l(b, 0)) ;
    S = l(b, 0) ;
    S = 0 ;

    Bonne journée.




    Citation Envoyé par Trap D Voir le message
    Pour suffixe on a l'un ou l'autre, peut-être qu'en faisant l'autre ou l'un ...

  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
    Bah, il me semble que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prefixe(X,l(T,Q)) :- (Q =.. [l | _] -> prefixe(X,Q); X = Q); X = l(T,Q) .
    fait l'affaire, Compare avec le code de suffixe !
    "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
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 16
    Points : 24
    Points
    24
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prefixe(X,l(T,Q)) :- (Q =.. [l | _] -> prefixe(X,Q); X = Q); X = l(T,Q).
    donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ?- prefixe(L, l(a,l(b,l(c,0)))).
    L = 0 ;
    L = l(c, 0) ;
    L = l(b, l(c, 0)) ;
    L = l(a, l(b, l(c, 0))).
    or l'énoncé demande que le prédicat préfixe affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ?* prefixe(P,l(a,l(b,0))).
    P = 0 ;
    P = l(a, 0) ;
    P = l(a, l(b, 0)) ;
    false.



    Citation Envoyé par Trap D Voir le message
    Bah, il me semble que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prefixe(X,l(T,Q)) :- (Q =.. [l | _] -> prefixe(X,Q); X = Q); X = l(T,Q) .
    fait l'affaire, Compare avec le code de suffixe !

  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
    Comme d'hab je n'ai pas bien lu la consigne
    Ce que j'ai fait ne me satisfait pas, que veut le prof pour prefixe(L, l(a,l(b,l(c,0)))).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    prefixe(X,l(T,Q)) :-
        prefixe(X1, Q),
        (   X = X1; X = l(T,X1); X = l(T, Q)).
     
    prefixe(0, l(_T,0)).
    "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

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/01/2018, 17h38
  2. [Débutant] Problème de prédicat
    Par pooi1 dans le forum Prolog
    Réponses: 5
    Dernier message: 06/01/2009, 11h31
  3. Surcharge d'opérateur préfixe - suffixe
    Par ptit_tof57 dans le forum C++
    Réponses: 4
    Dernier message: 24/06/2008, 17h55
  4. [Débutante] Inverser un prédicat
    Par mun_a dans le forum Prolog
    Réponses: 5
    Dernier message: 14/12/2007, 09h54
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

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