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 :

Prolog orienté objet


Sujet :

Prolog

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 39
    Points : 18
    Points
    18
    Par défaut Prolog orienté objet
    Bonsoir,

    Je suis débutant en Prolog et je cherche un tuto qui expliquerait la programmation orientée objet en Prolog.

    En effet j'aimerai comprendre un programme "basique" de relations entre polygone, carre, rectangle etc. développé en Prolog objet.

    J'ai eu beau cherché sur la toile, rien trouvé ou presque... Merci de 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
    XPCE permet de créer des classes regarde ici..
    Bien sur, c'est un peu orienté graphisme mais on peut faire des choses qui n'ont rien à voir.
    "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
    Tu as ici une distribution Prolog qui a une extension pour la POO : http://www.trinc.nl/ (la doc de cette extension : http://www.trinc.nl/doc/pl_obj.htm)

    Une autre : http://oopl.sourceforge.net/ - http://sourceforge.net/projects/oopl/

    Bon courage

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Bonsoir! Merci beaucoup. Je vais éplucher ça.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Je ne comprends pas comment utiliser les accesseurs 'getwidth(W)' et 'getwidth(H)' de la classe rectangle.

    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
    object(
       rectangle(Width, Height), [
          (getwidth(W) :-
             W is Width),
     
          (getheight(H) :-
             H is Height),
     
          (setwidth(NewRectangle, NewWidth) :-
             NewRectangle = rectangle(NewWidth, Height)),
     
          (setheight(NewRectangle, NewHeight) :-
             NewRectangle = rectangle(Width, NewHeight)),
     
          (print :-
             write('Drawing a Rectangle ('), 
             write(Width),
             write('*'),
             write(Height),
    		 write(')'),
             nl)
       ]
    ).
    Je voudrais par exemple afficher la Width d'un rectangle créé dans un autre fichier test.pl comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    test :-
       RectangleA = rectangle(15, 25),
       RectangleA::print,   
       RectangleA::setwidth(RectangleB,20),
       % Je voudrais afficher ici la nouvelle width de rectangleB via
       % l'accesseur getwidth(W) de rectangle
       % avec la fonction write
       RectangleB::print.
    Est-ce possible? Avez-vous une solution?
    Merci d'avance.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Dans le même genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    object(
    	carre(Cote), [
    		(surface(S) :- S is Cote*Cote),
    		(print :- 
    			write('CARRE'), nl,
    			write('surface: '),
    			write(??????),
    			nl)
    	]
    ).
    Comment afficher la valeur de la surface calculée juste au dessus ?

  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
    Pour la deuxième, il "suffit" à mon avis de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    object(
    	carre(Cote), [
    		(surface(S) :- S is Cote*Cote),
    		(print :- 
    			write('CARRE'), nl,
    			write('surface: '),
                            surface(S),
    			write(S),
    			nl)
    	]
    ).

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    En modifiant mon code comme tu me l'as conseillé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    object(
    	carre(Cote), [
    		(surface(S) :- S is Cote*Cote),	
    		(print :- 
    			write('CARRE'), nl,
    			write('surface: '),
    			surface(S),
    			write(S),
    			nl)
    	]
    ).
    J'obtiens cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    | ?- test.
    CARRE
    surface: 
    uncaught exception: error(existence_error(procedure,surface/1),process/2)

  9. #9
    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


    Au passage, la surface ce n'est pas Cote*Cote, et le perimètre Cote*4 ?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Si si, tout à fait!

    Je cherche toujours, Si quelqu'un a une idée ou une piste...
    Cf messages #5 et #6. Merci.

  11. #11
    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
    Une petite question : quel Prolog utilisez-vous ?
    J'ai essayé Trins-Prolog mais ça n'a pas l'air d'être ça.
    "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

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Bonsoir,

    J'utilise GNU-Prolog version 1.3.0 by Daniel Diaz.

  13. #13
    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 pmax35 Voir le message
    Bonsoir,

    J'utilise GNU-Prolog version 1.3.0 by Daniel Diaz.
    Et tu peux faire de l'OO avec GNU-Prolog ? J'émets des réserves là-dessus ...

  14. #14
    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
    Au temps pour moi, un peu.

    Il y a une extension de GNU-Prolog qui le permet : http://www.logtalk.org/

    Tu utilises cela ?

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Et bien non. je l'utilise sans extension...

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    :- op(600, xfy, ::).                            % send message to object
     
    % use '::' operator as syntax for send message
    Object::Message :-
       send(Object, Message).
     
    % send(Message, Object): find Object's method and execute
    send(Object, Message) :-
       get_methods(Object, Methods),                % Find Object's methods
       process(Message, Methods).                   % Execute corresponding method
     
    % get the defined methods for the class
    get_methods(Object, Methods) :-                 % Private methods
       object(Object, Methods).
     
    % get the defined methods inherited from the superclass
    get_methods(Object, Methods) :-                 % Inherited methods
       isa(Object, SuperObject),
       get_methods(SuperObject, Methods).
     
    % process the method if it is defined as a fact
    process(Message, [Message | _]) :-              % Use a fact
       process(Message, [Message | _]).
     
    % process the method if it is defined as a rule
    process(Message, [(Message :- Body) | _]) :-    % Use a rule
       call(Body).
     
    process(Message, [_ | Methods]) :-              % break the message up
       process(Message, Methods).
     
    object(
       shape(X, Y), [
          (getx(X) :- X is X),
          (gety(Y) :- Y is Y)
       ]
    ).
     
     
    object(
       rectangle(Width, Height), [
          (getwidth(W) :-
             W is Width),
     
          (getheight(H) :-
             H is Height),
     
          (setwidth(NewRectangle, NewWidth) :-
             NewRectangle = rectangle(NewWidth, Height)),
     
          (setheight(NewRectangle, NewHeight) :-
             NewRectangle = rectangle(Width, NewHeight)),
     
          (print :-
             write('Drawing a Rectangle ('), 
             write(Width),
             write('*'),
             write(Height),
             write(')'),
             nl)
       ]
    ).
     
    isa(rectangle(WIDTH, HEIGHT), shape(WIDTH, HEIGHT)).
    Dans ce code, je n'arrive pas à utiliser les getters du rectangle.
    Voici mon code de test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    test :-
       RectangleA = rectangle(15, 25),
       RectangleA::print,
       RectangleA::setwidth(RectangleB,20),
       RectangleB::print.
    Les setters fonctionnent bien mais pas les getters.
    Tu penses qu'il me faudrait installer l'extension pour que çà marche?

  16. #16
    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
    Je pense que ce serait plus pratique en tout cas, que cette syntaxe.

    Exemple de syntaxe avec logtalk :
    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
    :- object(list).
     
        :- public(append/3).
        :- public(length/2).
        :- public(member/2).
     
        append([], List, List).
        append([Head| Tail], List, [Head| Tail2]) :-
            append(Tail, List, Tail2).
     
        length(List, Length) :-
            length(List, 0, Length).
     
        length([], Length, Length).
        length([_| Tail], Acc, Length) :-
            Acc2 is Acc + 1,
            length(Tail, Acc2, Length).
     
        member(Element, [Element| _]).
        member(Element, [_| List]) :-
            member(Element, List).
     
    :- end_object.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Pour être franc. Je dois comprendre ce code (message #16) pour l'expliquer à mes petits camarades. Donc au niveau de la syntaxe, il m'est impossible de la modifier au profit de celle de logtalk même si celle-ci me paraît plus pratique...

    Mon deuxième problème est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    object(
    	rectangle(Longueur, Largeur), [
    		(surface(S) :- S is Longueur*Largeur),
    		(print :- write('RECTANGLE'), write(S), nl)
    	]
    ).
    Je ne sais pas comment afficher la surface S du rectangle...
    Le code ci-dessus m'affiche "RECTANGLE_28" pour le test suivant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    test :-
       RectangleA = rectangle(3,2),
       RectangleA::print.
    En fait je ne sais pas comment exploiter ce calcul et donc notamment comment l'afficher...

  18. #18
    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
    Il faut que tu unifies S en appelant surface(S), et ensuite tu affiches S, je pense.

  19. #19
    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
    Salut
    J'ai un peu regarder le code et ceci fonctionne :
    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
    object(
       rectangle(Width, Height), [
          (getwidth(W) :-
             W is Width),
     
          (getheight(H) :-
             H is Height),
     
          (setwidth(NewRectangle, NewWidth) :-
             NewRectangle = rectangle(NewWidth, Height)),
     
          (setheight(NewRectangle, NewHeight) :-
             NewRectangle = rectangle(Width, NewHeight)),
     
    	  (surface(S) :-
    		S is Width * Height),
     
          (print :-
             write('Drawing a Rectangle ('), 
             write(Width),
             write('*'),
             write(Height),
             write(')'),
             nl)
       ]
    ).
    Sortie
    | ?- test.
    Drawing a Rectangle (15*25)
    Drawing a Rectangle (20*25)
    375
    Il manque le code d'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    test :-
       RectangleA = rectangle(15, 25),
       RectangleA::print,
       RectangleA::setwidth(RectangleB,20),
       RectangleB::print,
       RectangleA::surface(S),
       write(S), nl.
    "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

  20. #20
    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
    D'où sort le 375 ?
    Qu'est-ce qui provoque son affichage ?

    Edit : ah je comprends mieux

Discussions similaires

  1. Prolog++ : un Prolog orienté objet
    Par Alp dans le forum Prolog
    Réponses: 5
    Dernier message: 22/12/2008, 11h30
  2. Stack OverFlow ou Violation d'adresse - Orienté Objet
    Par JakeGrafton dans le forum Langage
    Réponses: 7
    Dernier message: 31/05/2005, 16h34
  3. [DEBUTANT] Conseil sur la programmation orienté objet
    Par etiennegaloup dans le forum Langage
    Réponses: 7
    Dernier message: 27/05/2005, 12h59
  4. Réponses: 2
    Dernier message: 01/05/2005, 14h43
  5. [SGBDOO] Base de données orientée objet
    Par Jaona dans le forum Décisions SGBD
    Réponses: 19
    Dernier message: 14/04/2003, 11h07

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