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 :

Passage de TurboProlog à Swi-Prolog


Sujet :

Prolog

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 118
    Points : 68
    Points
    68
    Par défaut Passage de TurboProlog à Swi-Prolog
    Bonsoir ,

    J'ai programmé Prolog en utilisant TurboProlog , mais maintenant , j'ai un mini projet avec SWI-Prolog.
    Donc comme première étape , j'ai fait une partie du code avec Turbo-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
    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
     
    DOMAINS
     
    list= symbol* 
    list_I = integer*
     
    PREDICATES
     
    compare(list,list)
    exacte(list,list,list_I)
    Tester(list,list,list_I)
    decaler(list_I,list_I)
    existe(list,list,list_I,integer,list_I)
    element(list,integer,symbol)
    verif(symbol,list,list_I) 
    inclus(list_I,list_I)
    dans(integer,list_I)
     
    CLAUSES
     
    compare(X,X).
     
    exacte([A|X],[B|Y],L) :- A<>B,exacte(X,Y,L1), decaler(L1,L).
    exacte([A|X],[B|Y],L) :- A=B, exacte(X,Y,L1) , decaler(L1,L2),L=[1|L2].
    exacte([],[],[]).
     
    decaler([A|X],[B|Y]):- B=A+1,decaler(X,Y).
    decaler([],[]).
     
    Tester(X,Y,L):- exacte(X,Y,E),existe(X,Y,L,1,E).
     
    existe([A|X],Y,L,R1,E):- R2=R1+1,existe(X,Y,LT,R2,E), element(Y,R1,C) , A<>C, verif(A,Y,L3),not(inclus(L3,E)), L= [R1|LT].
    existe([A|X],Y,L,R1,E):- R2=R1+1,existe(X,Y,LT,R2,E), element(Y,R1,C) , A<>C, verif(A,Y,L3),inclus(L3,E),L= LT.
     
    existe([A|X],Y,L,R1,E):- R2=R1+1,existe(X,Y,LT,R2,E), element(Y,R1,C) , A=C, L= LT.
     
    existe([],_,[],_,_).
     
    element([A|_],1,A) .
     
    element([_|L],R,X):- R>1,R1=R-1, element(L,R1,X).
     
    verif(A,[A|X],[1|Y]):- verif(A,X,L),decaler(L,Y).
     
    verif(A,[B|Y],L):- A<>B,verif(A,Y,L2),decaler(L2,L).
     
    verif(_,[],[]).
     
    inclus([A|X],Y):- inclus(X,Y),dans(A,Y).
     
    inclus([],_).
     
    dans(A,[A|_]).
     
    dans(A,[B|Y]):- A<>B,dans(A,Y).
    mais il ne marche pas avec Swi-Prolog ! Apparemment ils n'ont pas le même syntaxe !

    Qu'est ce que je dois faire? Comment Récrire le même code pour qu'il soit compilé avec Swi-Prolog ?

    (J'ai cherché un peu sur Swi-prolog , mais ça reste flou , surtout pour l'utilisation des listes (déclaration de mes propres listes ,...))


    Merci d'avance .

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    enlever toute forme de typage, et la séparation des sections, ça devrait suffire

    (c'est d'ailleurs ce qui faisait la "vitesse" de Turbo Prolog sur une approche classique )
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 118
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    enlever toute forme de typage, et la séparation des sections, ça devrait suffire

    (c'est d'ailleurs ce qui faisait la "vitesse" de Turbo Prolog sur une approche classique )
    Merci bien "gorgonite" .

    C'est ce que j'ai fait déjà! mais ce n'est pas suffisant !

    Voici le nouveau code : (fichier.pl) :


    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
     
    compare(X,X).
    decaler([A|X],[B|Y]):- B=A+1,decaler(X,Y).
    decaler([],[]).
    element([A|_],1,A) .
    element([_|L],R,X):- R>1,R1=R-1, element(L,R1,X).
    dans(A,[A|_]).
    dans(A,[B|Y]):- A<>B,dans(A,Y).
    verif(A,[A|X],[1|Y]):- verif(A,X,L),decaler(L,Y).
    verif(A,[B|Y],L):- A<>B,verif(A,Y,L2),decaler(L2,L).
    verif(_,[],[]).
    exacte([A|X],[B|Y],L) :- A<>B,exacte(X,Y,L1), decaler(L1,L).
    exacte([A|X],[B|Y],L) :- A=B, exacte(X,Y,L1) , decaler(L1,L2),L=[1|L2].
    exacte([],[],[]).
    inclus([A|X],Y):- inclus(X,Y),dans(A,Y).
    inclus([],_).
    existe([A|X],Y,L,R1,E):- R2=R1+1,existe(X,Y,LT,R2,E), element(Y,R1,C) , A<>C, verif(A,Y,L3),not(inclus(L3,E)), L= [R1|LT].
    existe([A|X],Y,L,R1,E):- R2=R1+1,existe(X,Y,LT,R2,E), element(Y,R1,C) , A<>C, verif(A,Y,L3),inclus(L3,E),L= LT.
    existe([A|X],Y,L,R1,E):- R2=R1+1,existe(X,Y,LT,R2,E), element(Y,R1,C) , A=C, L= LT.
    existe([],_,[],_,_).
    Tester(X,Y,L):- exacte(X,Y,E),existe(X,Y,L,1,E).

    et voici les messages d'errors :


    ERROR: c:/Blabla/fichier.pl:7:0: Syntax error: Operator expected
    ERROR: c:/Blabla/fichier.pl:9:0: Syntax error: Operator expected
    ERROR: c:/Blabla/fichier.pl:11:0: Syntax error: Operator expected
    ERROR: c:/Blabla/fichier.pl:16:0: Syntax error: Operator expected
    ERROR: c:/Blabla/fichier.pl:17:0: Syntax error: Operator expected
    ERROR: c:/Blabla/fichier.pl:20:0: Syntax error: Operator expected
    % fichier.pl compiled 0.02 sec, 4,984 bytes

  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
    Déjà remplace tous les '=' dans B=A+1 et R2 = R1 + 1 par 'is', il n'y a pas le = de l'affectation en SWI-Prolog.
    <> n'existe pas c'est \= qu'il faut utiliser.

    Il y a peut-être d'autres erreurs mais il faudrait que je teste 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

  5. #5
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Déjà remplace tous les '=' dans B=A+1 et R2 = R1 + 1 par 'is', il n'y a pas le = de l'affectation en SWI-Prolog.

    pas d'accord pour B=A+1, je crois bien que le is est une sorte d'affectation avec que le = implique une unification (et le == une pseudo-égalité )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    decaler([A|X],[B|Y]):- B=A+1,decaler(X,Y).

    en revanche, peut-être que ceci pourrait marcher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    decaler([A|X],[B|Y]) :- 
      var(A),!,
      TMP is B-1,
      TMP=A,decaler(X,Y).
    decaler([A|X],[B|Y]) :- 
      TMP is A+1,
      TMP=B,decaler(X,Y).
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 118
    Points : 68
    Points
    68
    Par défaut

    Merci à vous tous !
    ça marche bien !

    mais juste j'ai quelques remarques :

    1- Pour corriger les erreurs , j'ai juste remplacer <> par \= et remplacer Tester par tester (le 't' minuscule )
    2- Après avoir corriger ces erreurs , j'ai constaté que pour évaluer un entier , il faut passer par l'utilisation de VAR ! ce qui est tout à fait normale car ce Swi-Prolog n'utilise pas la notion de typage (reste à vérifier avec vous )

    3- @gorgonite : je suis tout à fait d'accord avec vous à propos de l'utilisation de '= ' VS is . Car j'ai utilisé le '=' en TurboProlog pour faire une unification !
    4- Est ce qu'il y a une possibilité de faire le calcul sans passer par 'is'.
    ie :
    je veux faire
    à la place de
    (Je ne veux utiliser aucune affectation !)
    5: Merci à "Trap D" et "gorgonite"

  7. #7
    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 is n'est pas une affectation mais permet l'évaluation d'une expression arithmétique (ce que je soupçonne en voyant R2 = R1 + 1).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    -Number is +Expr                                                  [ISO]
        True  if Number has successfully  been unified with the number  Expr
        evaluates to.   If Expr evaluates to a float that can be represented
        using  an integer (i.e,  the value is  integer and within the  range
        that can be  described by Prolog's integer representation),  Expr is
        unified with the integer value.
     
        Note  that normally, is/2 should be used with unbound  left operand.
        If equality is to be tested, =:=/2 should be used.  For example:
     
                 ?- 1 is sin(pi/2).   Fails!.   sin(pi/2) evaluates
                                      to the float  1.0, which does
                                      not unify with the integer 1.
                 ?- 1 =:= sin(pi/2).  Succeeds as expected.
    var/1 permet simplement de savoir si une variable est libre ou non.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    1 ?- var(X).
    true.
     
    2 ?- var(3).
    false.
     
    3 ?- X = 5, var(X).
    false.
    "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. Probleme passage de Eclipse prolog a SWI-Prolog
    Par Mattorre dans le forum Prolog
    Réponses: 7
    Dernier message: 12/12/2010, 21h31
  2. Réponses: 1
    Dernier message: 09/01/2007, 15h33
  3. Le mode debug de swi-prolog
    Par Boubou Balrog dans le forum Prolog
    Réponses: 2
    Dernier message: 18/12/2006, 11h55
  4. Désactiver les warnings en swi-prolog
    Par Cecilka dans le forum Prolog
    Réponses: 2
    Dernier message: 15/12/2006, 12h33
  5. Réponses: 3
    Dernier message: 03/05/2006, 16h30

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