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 :

Impossible d'inverser le résultat


Sujet :

Prolog

  1. #1
    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 Impossible d'inverser le résultat
    Salut,


    J'ai cette fonction...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    % on calcule les differences de X avec tous les elements de L
    calc_all_differences(_,[],[]).
    calc_all_differences(X,[H|Q],[N|L]) :-
    	X is N+H,
    	calc_all_differences(X,Q,L).
    voilà le problème
    | ?- calc_all_differences(1,[0],L).
    uncaught exception: error(instantiation_error,(is)/2)
    | ?- calc_all_differences(1,[0],[1]).

    true ?

    yes
    | ?-
    pourquoi ne veut-il pas me donner le résultat ?
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  2. #2
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par gorgonite
    pourquoi ne veut-il pas me donner le résultat ?
    Je dirais que c'est toujours la même erreur... J'aurais tendance à dire que ce qui est à droite du "is" doit être instancié, pour que ce qui est à gauche puisse être affecté.

  3. #3
    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
    mais dans ce cas, cela ne marche plus...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    | ?- calc_all_differences(N,[0],[1]).
    uncaught exception: error(instantiation_error,(is)/2)
    alors que ça marchait avec la règle précédente...


    [EDIT] quand je mets les deux, y en a quand même un qui foire
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  4. #4
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par gorgonite
    mais dans ce cas, cela ne marche plus...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    | ?- calc_all_differences(N,[0],[1]).
    uncaught exception: error(instantiation_error,(is)/2)
    alors que ça marchait avec la règle précédente...


    [EDIT] quand je mets les deux, y en a quand même un qui foire
    Je suis pas sûr que tu puisses faire marcher ton prédicat dans les deux sens avec "is"... J'attends avec impatience la solution de pcaboche

  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 Eusebius
    Je suis pas sûr que tu puisses faire marcher ton prédicat dans les deux sens avec "is"... J'attends avec impatience la solution de pcaboche

    +1 c'est pour cela qu'au dela de deux arguments, je n'y arrive plus...


    mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    % on calcule les differences de X avec tous les elements de L
    calc_all_differences(_,[],[]).
    % methode 1
    calc_all_differences(X,[H|Q],[N|L]) :-
    	calc_all_differences(X,Q,L),
    	X is N+H.
    % methode 2
    calc_all_differences(X,[H|Q],[N|L]) :-
    	N is X-H,
    	calc_all_differences(X,Q,L).
    avec ces deux méthodes, tout devrait marcher... mais methode 2 n'est jamais utilisé :cry;
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  6. #6
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    ya pas des prédicats prédéfinis pour savoir si une variable est instanciée ?

  7. #7
    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 Eusebius
    ya pas des prédicats prédéfinis pour savoir si une variable est instanciée ?
    gagné... je ne savais même pas que c'était possible


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    % on calcule les differences de X avec tous les elements de L
    calc_all_differences(_,[],[]).
    calc_all_differences(X,[H|Q],[N|L]) :-
    	var(X),
    	calc_all_differences(X,Q,L),
    	X is N+H.
    calc_all_differences(X,[H|Q],[N|L]) :-
    	var(N),
    	N is X-H,
    	calc_all_differences(X,Q,L).
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  8. #8
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Eusebius
    J'attends avec impatience la solution de pcaboche
    pcaboche, le sauveur du Prolog !
    (qui malheureusement va devoir s'absenter à partir de 16h15)


    Et bien pcaboche, il aimerait déjà comprendre ce que le prédicat est censé faire, parce que là, le nom ne l'aide pas beaucoup...

    Ce qui serait top, ce serait de savoir quels paramètres sont en entrée (+), quels paramètres sont en sortie (-) et quels paramètres peuvent être en entrée ou en sortie (?). Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    % predicat(+X, -L1, -L2).
     
    % ou
     
    % predicat(?X, ?L1, ?L2).
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  9. #9
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    @gorgonite: tu oublies un cas: le cas où X, L1 et L2 sont tous instanciés et que l'on veut vérifier que l'on a bien la propriété X=N+H pour tous les éléments de la liste.

    J'y reviendrai plus tard, là il faut que j'y aille.

    A+
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  10. #10
    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
    Ce qui serait top, ce serait de savoir quels paramètres sont en entrée (+), quels paramètres sont en sortie (-) et quels paramètres peuvent être en entrée ou en sortie (?).
    en fait, ils sont tous en entrée/sortie... car je veux pouvoir résoudre tous les problèmes existant avec cette fonction


    Citation Envoyé par pcaboche
    @gorgonite: tu oublies un cas: le cas où X, L1 et L2 sont tous instanciés et que l'on veut vérifier que l'on a bien la propriété X=N+H pour tous les éléments de la liste.

    en effet, tu as raison... voilà le cas "correct"

    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
    % on calcule la liste des differences de X avec tous les elements de L
    calc_all_differences(_,[],[]).
    calc_all_differences(X,[H|Q],[N|L]) :-
    	var(X),
    	!,
    	calc_all_differences(X,Q,L),
    	X is N+H.
    calc_all_differences(X,[H|Q],[N|L]) :-
    	var(N),
    	!,
    	N is X-H,
    	calc_all_differences(X,Q,L).
    calc_all_differences(X,[H|Q],[N|L]) :-
    	var(H),
    	!,
    	H is X-N,
    	calc_all_differences(X,Q,L).
    calc_all_differences(X,[H|Q],[N|L]) :-
    	calc_all_differences(X,Q,L),
    	X is N+H.
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  11. #11
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Avant de partir:

    En swi-prolog, il existe le prédicat:
    qui marche si au moins 2 des paramètres sont unifiés (n'importe lesquels).

    En l'utilisant, ça se résume à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    calc_all_differences(_,[],[]) :- !.
    calc_all_differences(A,[B|Q1],[C|Q2]) :-
      plus(B, C, A),
      calc_all_differences(A, Q1, Q2).
    Il ne reste plus qu'à implémenter le prédicat plus/3 s'il n'existe pas sous GNU-Prolog.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  12. #12
    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 pcaboche
    Il ne reste plus qu'à implémenter le prédicat plus/3 s'il n'existe pas sous GNU-Prolog.

    bien sûr qu'il n'existe pas... enfin pas encore

    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
    % addition
    plus(X,Y,Z) :-
    	var(X),
    	!,
    	X is Z-Y.
    plus(X,Y,Z) :-
    	var(Y),
    	!,
    	Y is Z-X.
    plus(X,Y,Z) :-
    	var(Z),
    	!,
    	Z is X+Y.
    plus(X,Y,Z) :-
    	Z is X+Y.

    EDIT

    mais ça ne marche pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    | ?- calc_all_differences(3,[1,0],L).
     
    no
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  13. #13
    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
    Tu as du mal le taper, en SWI-Prolog, ça 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
    % addition
    my_plus(X,Y,Z) :-
    	var(X),
    	!,
    	X is Z-Y.
    my_plus(X,Y,Z) :-
    	var(Y),
    	!,
    	Y is Z-X.
    my_plus(X,Y,Z) :-
    	var(Z),
    	!,
    	Z is X+Y.
    my_plus(X,Y,Z) :-
    	Z is X+Y.
     
    calc_all_differences(_,[],[]) :- !.
    calc_all_differences(A,[B|Q1],[C|Q2]) :-
      my_plus(B, C,A),
      calc_all_differences(A, Q1, Q2).
    On obtient:
    3 ?- calc_all_differences(3,[1,0],L).

    L = [2, 3]

    Yes
    "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

  14. #14
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Bonsoir tout le monde, je suis de retour.

    Moi j'ai ça comme programme :
    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
    calc_all_differences(_,[],[]) :- !.
    calc_all_differences(A,[B|Q1],[C|Q2]) :-
      +(B, C, A),
      calc_all_differences(A, Q1, Q2).
     
     
     
    +(A, B, R) :-
      nonvar(A), nonvar(B),
      !,
      R is A+B.
     
    +(A, B, R) :-
      nonvar(B), nonvar(R),
      !,
      A is R-B.
     
    +(A, B, R) :-
      nonvar(A), nonvar(R),
      !,
      B is R-A.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/11/2011, 12h35
  2. [Bind9] Resolution inverse impossible
    Par nuitn0ire dans le forum Réseau
    Réponses: 0
    Dernier message: 03/03/2010, 11h27
  3. [ArchiveBuilder][JavaMail] exécution impossible...
    Par Gorthal dans le forum JBuilder
    Réponses: 7
    Dernier message: 10/01/2003, 09h12
  4. Réponses: 8
    Dernier message: 20/11/2002, 11h50
  5. [VB6]fonction inverse de Hex (nombres hexadécimaux)
    Par Guigui_ dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 08/10/2002, 19h31

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