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 :

Améliorer un programme très simple


Sujet :

Prolog

  1. #1
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut Améliorer un programme très simple
    Salut,

    Histoire d'écouter le conseil de Trap.D dans sa signature, je me suis mis à Prolog, et j'aime bien !

    Je m'essaye à l'écriture de programme manipulant les listes.

    Le programme suivant permet de déterminer si, oui ou non, un 1 est présent dans la liste passée en argument.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    there_is_one([]) :- fail.
    there_is_one(T) :- T==1,!.
    there_is_one([H|Q]) :-
    	H==1,!.
    there_is_one([H|Q]) :-
    	there_is_one(Q),!.
    J'aurais voulu savoir si c'était simplifiable.

    De plus, j'ai également tenté d'écrire un programme permettant de déterminer si un nombre était premier, mais j'avoue que je me suis un peu ramassé vis à vis des habitudes que je n'ai qu'à moitié prises pour la programmation en prolog.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    /* NE MARCHE PAS */
     
    is_prime(2,1).
    /* ToF = True or False */
     
    is_prime(X,ToF) :-
    	X > 2,
    	Y is X-1,
    	is_prime_1(X,Y,ToF1),
    	ToF is ToF1.
     
     
    is_prime_1(X,1,1).
    is_prime_1(X,Y,ToF) :-
    	(X mod Y) \= 0,
    	Y1 is Y-1,
    	is_prime_1(X,Y1,ToF1),
    	ToF1 == 1,
    	ToF is 1.
    Je n'ai rien trouvé de concluant sur developpez ni sur google.

    pour les conseils et corrections

  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
    Citation Envoyé par Alp Voir le message
    Histoire d'écouter le conseil de Trap.D dans sa signature, je me suis mis à Prolog, et j'aime bien !
    Ouiiiiiiii, j'ai un disciple
    Je vais essayer d'être à la hauteur.
    Citation Envoyé par Alp Voir le message
    Le programme suivant permet de déterminer si, oui ou non, un 1 est présent dans la liste passée en argument.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    there_is_one([]) :- fail.
    there_is_one(T) :- T==1,!.
    there_is_one([H|Q]) :-
    	H==1,!.
    there_is_one([H|Q]) :-
    	there_is_one(Q),!.
    J'aurais voulu savoir si c'était simplifiable.
    Oui tout à fait.
    On veut savoir si 1 est présent, si oui on a gagné on peut s'arréter.
    On parcourt la liste élément par élément.
    Donc si la liste est vide, c'est qu'on l'a parcourue en entier sans le trouver, c'est échec et ta première clause est correcte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    there_is_one([]) :- fail.
    Maintenant il suffit d'examiner le premier élément de la liste
    Si c'est 1, on a gagné, pas besoin d'aller plus loin (celà se traduit par le "cut" !), le reste de la liste ne nous intéresse plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    there_is_one([1 | _T]) :- !.
    Enfin, si le premier élément n'est pas 1, on continue avec le reste de la liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    there_is_one([_H|Q]) :-
    	there_is_one(Q).
    Citation Envoyé par Alp Voir le message
    De plus, j'ai également tenté d'écrire un programme permettant de déterminer si un nombre était premier, mais j'avoue que je me suis un peu ramassé vis à vis des habitudes que je n'ai qu'à moitié prises pour la programmation en prolog.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    /* NE MARCHE PAS */
     
    is_prime(2,1).
    /* ToF = True or False */
     
    is_prime(X,ToF) :-
    	X > 2,
    	Y is X-1,
    	is_prime_1(X,Y,ToF1),
    	ToF is ToF1.
     
     
    is_prime_1(X,1,1).
    is_prime_1(X,Y,ToF) :-
    	(X mod Y) \= 0,
    	Y1 is Y-1,
    	is_prime_1(X,Y1,ToF1),
    	ToF1 == 1,
    	ToF is 1.
    Je n'ai rien trouvé de concluant sur developpez ni sur google.

    pour les conseils et corrections
    Tu utilises un codage "à la C" pour ToF, en Prolog on travaille plutôt avec "Echec" ou "Réussite" des prédicats. Tu aurais pu utiliser yes / no !
    En ce qui concerne ce programme voici le code corrigé et commenté.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    % 2 est un nombre premier, on ne va pas plus loin
    is_prime(2,yes) :- !.
    /* ToF = True or False */
     
    % On est sûr que X est plus grand que 2
    % on appelle la fonction de calcul initialisée
    % le retour de celle-ci est le retour recherché
    is_prime(X,ToF) :-
    	Y is X-1,
    	is_prime_1(X,Y,ToF).
     
     
    % la décrémentation du diviseur est terminée, 
    % le nombre est premier, on s'arrête
    is_prime_1(_X,1,yes) :- !.
     
    % X est divisible par Y, 
    % X n'est pas premier, on s'arrête
    is_prime_1(X,Y,no) :-
    	0 is X mod Y, !.
     
    % on continue le calcul
    is_prime_1(X,Y,ToF) :-
    	Y1 is Y-1,
    	is_prime_1(X,Y1,ToF).
    "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
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Ouiiiiiiii, j'ai un disciple
    Je vais essayer d'être à la hauteur.
    Pas trop la pression ?


    Maintenant il suffit d'examiner le premier élément de la liste
    Si c'est 1, on a gagné, pas besoin d'aller plus loin (celà se traduit par le "cut" !), le reste de la liste ne nous intéresse plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    there_is_one([1 | _T]) :- !.
    Enfin, si le premier élément n'est pas 1, on continue avec le reste de la liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    there_is_one([_H|Q]) :-
    	there_is_one(Q).
    J'ai bien compris, mis à part les deux underscores que tu utilises devant T et H. Pourquoi les mettre ? D'après ce que j'ai compris, on s'en sert quand il y a des "arguments" que l'on ne veut pas traiter, mais pour lesquels on veut montrer qu'ils sont là, simplement.


    Tu utilises un codage "à la C" pour ToF, en Prolog on travaille plutôt avec "Echec" ou "Réussite" des prédicats. Tu aurais pu utiliser yes / no !

    Je vais essayer de m'habituer aux notations prolog. Prolog venant de Marseille, autement ma ville (), je vois des termes un peu plus "d'ici", mais bon

    Citation Envoyé par Trap.D
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    % On est sûr que X est plus grand que 2
    % on appelle la fonction de calcul initialisée
    % le retour de celle-ci est le retour recherché
    is_prime(X,ToF) :-
    	Y is X-1,
    	is_prime_1(X,Y,ToF).
    Pourquoi utiliser le même ToF ? Il va descendre d'appel en appel puis remonter après chaque appel ?
    Je pensais qu'il fallait exprimer la réussite, dans chaque appel de is_prime_1 ou pas par la valeur de ToF.


    Citation Envoyé par Trapd.D
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    % la décrémentation du diviseur est terminée, 
    % le nombre est premier, on s'arrête
    is_prime_1(_X,1,yes) :- !.
     
    % X est divisible par Y, 
    % X n'est pas premier, on s'arrête
    is_prime_1(X,Y,no) :-
    	0 is X mod Y, !.
     
    % on continue le calcul
    is_prime_1(X,Y,ToF) :-
    	Y1 is Y-1,
    	is_prime_1(X,Y1,ToF).
    Encore une fois, je ne saisis pas l'utilisation du underscore.
    Pour le "0 is X mod Y", cela ne revient-il pas au même de faire : X mod Y == 0 ?

    Désolé pour ces questions, mais faut bien que tu t'occupes après tout

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    is_prime(X,ToF) :-
    	Y is X-1,
    	is_prime_1(X,Y,ToF).
    Pourquoi utiliser le même ToF ? Il va descendre d'appel en appel puis remonter après chaque appel ?
    Je pensais qu'il fallait exprimer la réussite, dans chaque appel de is_prime_1 ou pas par la valeur de ToF.
    Si tu utilises ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    is_prime(X,ToF) :-
    	Y is X-1,
    	is_prime_1(X,Y,ToF1),
            ToF is ToF1.
    il y aura une inférence de plus pour unifier ToF à ToF1, elle ne sert à rien. En plus, il me semble que c'est plus clair, le résultat final du calcul est celui du calcul qu'il a engendré.

    Pour ce qui est des underscore, tu as raison, ils signifient qu'on n'est pas intéressé par la valeur de l'argument, j'ai l'habitude de rappeler le nom de la variable après pour savoir à quoi elle correspond quand j'utilise effectivement la valeur dans d'autres clauses du même prédicat (je me demande en l'écrivant si je suis clair ).

    Je vais essayer de m'habituer aux notations prolog. Prolog venant de Marseille, autement ma ville (), je vois des termes un peu plus "d'ici", mais bon
    Je ne sais pas si Prolog acceptera d'unifier les "putain-cong"
    "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
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Si tu utilises ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    is_prime(X,ToF) :-
    	Y is X-1,
    	is_prime_1(X,Y,ToF1),
            ToF is ToF1.
    il y aura une inférence de plus pour unifier ToF à ToF1, elle ne sert à rien. En plus, il me semble que c'est plus clair, le résultat final du calcul est celui du calcul qu'il a engendré.
    Ok, je vois. Merci

    Citation Envoyé par Trap D Voir le message
    Pour ce qui est des underscore, tu as raison, ils signifient qu'on n'est pas intéressé par la valeur de l'argument, j'ai l'habitude de rappeler le nom de la variable après pour savoir à quoi elle correspond quand j'utilise effectivement la valeur dans d'autres clauses du même prédicat (je me demande en l'écrivant si je suis clair ).
    Ah, ok. C'est vrai que l'habitude n'est pas mauvaise. Je vais essayer de me forcer à le faire également !

    Citation Envoyé par Trap D Voir le message
    Je ne sais pas si Prolog acceptera d'unifier les "putain-cong"
    Maaaaaaaaais siiiiiii
    Dans le pire des cas, je me fais mon "Marseille Prolog" et voilà

    pour ton aide. Résolu

  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
    J'avais oublié pour
    Pour le "0 is X mod Y", cela ne revient-il pas au même de faire : X mod Y == 0 ?
    Oui, tout à fait.
    "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
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Merci chef

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

Discussions similaires

  1. Requète d'un programme très simple
    Par Giovanni858 dans le forum Général Java
    Réponses: 1
    Dernier message: 26/05/2012, 10h57
  2. Réponses: 4
    Dernier message: 27/04/2009, 19h33
  3. programme très simple en .cpp
    Par benjamin71 dans le forum Débuter
    Réponses: 8
    Dernier message: 24/11/2008, 17h33
  4. Application Web Client/Serveur très très simple
    Par n_tony dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 07/03/2006, 14h29
  5. Demarage des programmes très long
    Par venegan dans le forum Autres Logiciels
    Réponses: 7
    Dernier message: 02/03/2006, 16h50

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