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 :

coktail possible ou pas ?


Sujet :

Prolog

  1. #1
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2015
    Messages : 12
    Points : 5
    Points
    5
    Par défaut coktail possible ou pas ?
    bonjour,
    retraité et ancien programmeur je "découvre" prolog.

    j'essai de construire une base de données de coktails avec leurs noms ,leurs compositions,les ingrédients disponibles et j'e voudrais trouver lesquels sont réalisablle. je commence par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    punch([rhum,sucre]).
    gin_fizz([gin,tonic]).
    anis([ricard,eau]).
    cocktail([punch,gin_fizz,anis]).
     
    ingredient([cocktail]).
    et la rien ne va,
    je pensai retouver ds ingrédient la liste "rhum, sucre, gin, etc.." mis non .

    suis je mal parti ?
    help ?

  2. #2
    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 darderos Voir le message
    suis je mal parti ?
    Mal parti ? Oui, très.

    Retraité ? Non, j'y crois (c'est bien imité, mais les retraités s'expriment en bon français, pas en langage SMS).


    Je pense plutôt que vous avez un prof qui connaît bien ses étudiants et leur intérêt pour les boissons alcoolisées.

    Mais bon, vous êtes tellement mal parti qu'il faut quasiment vous donner la solution :
    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
    ingredients( punch,    [rhum, sucre]).
    ingredients( gin_fizz, [gin, tonic]).
    ingredients( anis,     [ricard, eau]).
    ingredients( potion_pour_lendemain_de_fete, [eau, paracetamol] ).
     
    cocktail( punch ).
    cocktail( gin_fizz ).
    cocktail( anis ).
     
    realisable( Disponibles, Recette ) :-
        ingredients( Recette, Ingredients )
      , forall( ???, ??? )
      .
     
    cocktail_realisable( Disponibles, Recette ) :-
        cocktail( Recette )
      , realisable( Disponibles, Recette )
      .  
     
    % Exemple:
    % cocktail_realisable( [gin, rhum, sucre, tonic], C).
    Je vous laisse compléter le prédicat realisable/2 (indice : allez voir du côté des prédicats member/2 et memberchk/2).
    "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...

  3. #3
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2015
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par pcaboche Voir le message
    Mal parti ? Oui, très.

    Retraité ? Non, j'y crois (c'est bien imité, mais les retraités s'expriment en bon français, pas en langage SMS).


    Je pense plutôt que vous avez un prof qui connaît bien ses étudiants et leur intérêt pour les boissons alcoolisées.

    Mais bon, vous êtes tellement mal parti qu'il faut quasiment vous donner la solution :
    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
    ingredients( punch,    [rhum, sucre]).
    ingredients( gin_fizz, [gin, tonic]).
    ingredients( anis,     [ricard, eau]).
    ingredients( potion_pour_lendemain_de_fete, [eau, paracetamol] ).
     
    cocktail( punch ).
    cocktail( gin_fizz ).
    cocktail( anis ).
     
    realisable( Disponibles, Recette ) :-
        ingredients( Recette, Ingredients )
      , forall( ???, ??? )
      .
     
    cocktail_realisable( Disponibles, Recette ) :-
        cocktail( Recette )
      , realisable( Disponibles, Recette )
      .  
     
    % Exemple:
    % cocktail_realisable( [gin, rhum, sucre, tonic], C).
    Je vous laisse compléter le prédicat realisable/2 (indice : allez voir du côté des prédicats member/2 et memberchk/2).
    Bonjour,

    Merci pour votre rapide réponse .

    Mais si, je suis retraité (né en 1949), j'ai terminé ma carrière en travaillant sur des bases de données, et programmant notamment en SAS .

    Je connais prolog de nom, mais ne mis suis jamais "frotté" .Aprés avoir lu un article sur l'IA , j'ai "fureté" sur le net et me suis lancé.J'ai écris (en copiant pas mal d'exemples) un programme de généalogie qui tourne pas trop mal;
    Il me reste un probleme, si je veux connaître tous les liens de parenté d'une personne, l'interrogation s'arrète au premier "false" .





    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     man(arthur).
     man(mlr).
     man(benoit).
     man(germain).
     man(antoine).
     woman(simone).
     woman(sylvie).
     woman(melanie).
     woman(camille).
     woman(jeanne).
     woman(lea).
     woman(margot).
     
    human(X):-(man(X);woman(X)).
     
     
     
     
     parent(arthur,mlr).
     parent(simone,mlr).
     parent(arthur,jean).
     parent(simone,jean).
     
     parent(mlr,benoit).
     parent(sylvie,benoit).
     parent(mlr,germain).
     parent(sylvie,germain).
     
     parent(benoit,margot).
     parent(benoit,antoine).
     parent(melanie,margot).
     parent(melanie,antoine).
     
    parent(germain,jeanne).
     parent(germain,lea).
    parent(camille,jeanne).
     parent(camille,lea).
     
    enfant(A,B):-parent(B,A).
    father(F,C):-man(F),parent(F,C).
    mother(M,C):-woman(M),parent(M,C).
     
    couple(F,M):-father(F,C),mother(M,C).
    %couple2(F,M):-man(F),parent(F,C),woman(M),parent(M,C).
     
    belle_mere(M,S):-couple(B,M),mother(S,B).
     
     
     
     son(S,P):-man(S),parent(P,S).
    fils(S):-son(S,_).
     daughter(D,P):-woman(D),parent(P,D).
     siblings(A,B):-parent(P,A),parent(P,B),A\=B.
     
    % siblings have at least one common parent % the test A\=B preserves that siblings are different persons
     
     full_siblings(A,B):- father(F,A),father(F,B),
     mother(M,A),mother(M,B), A\=B.
     
    frere(A,B):- full_siblings(A,B),man(B), A\=B.
    soeur(A,B):- full_siblings(A,B),woman(B).
     
     
     
     
     tante(A,N):-woman(A),full_siblings(A,P),parent(P,N).
     
     tante2(A,N):-siblings(A,P),parent(P,N),woman(A).
     % oncle(A,N):-man(A),siblings(A,P),parent(P,N),A\=P,A\=N.
       oncle(A,N):-man(A),full_siblings(A,P),parent(P,N),A\=P,A\=N.
     
      grand_parent(G,N):-parent(G,X),parent(X,N).
      grand_pere(G,N):-grand_parent(G,N),man(G).
     grand_mere(G,N):-grand_parent(G,N),woman(G).
     
    %_________________
    %
    cous(A,B):-parent(P,A),parent(Q,B),full_siblings(Q,P).
    cousin(A,B):-man(B),parent(P,A),parent(Q,B),full_siblings(Q,P).
    cousine(A,B):-woman(B),parent(P,A),parent(Q,B),full_siblings(Q,P).
    descendent(D,A):-parent(A,D). descendent(D,A):-parent(P,D),descendent(P,A).
     
    ancestor(A,D):-descendent(D,A).
    q1(X) :- father(Papa,X),write(Papa),write(' est le papa de '),write(X),nl.
    q2(X):-	mother(Maman,X),write(Maman),write(' est la maman de '),write(X),nl,nl.
    q3(X):-	grand_pere(Papy,X),write(Papy),write(' est le papy de '),write(X),nl.
     
    q4(X):-	grand_mere(Mamy,X),write(Mamy),write(' est la mamy de '),write(X),nl,nl.
    q5(X):-	couple(Mari,X),write(Mari),write(' est le mari de '),write(X),nl,nl.
    q6(X):-tante(Tante,X),write(Tante),write(' est la tante de '),write(X),nl,nl.
    q7(X):-oncle(Oncle,X),write(Oncle),write(' est l oncle de '),write(X),nl,nl.
    q8(X):-cousin(X,Cousin),write(Cousin),write(' est le cousin de '),write(X),nl,nl.
    q9(X):-cousine(X,Cousine),write(Cousine),write(' est la cousine de '),write(X),nl,nl.
     
     
    q10(X):-couple(Mari,X),write(Mari),write(' est le mari de '),write(X),nl,nl.
     
    q11(x):-belle_mere(M,S),write(S),write(' est la belle mere de '),write(M),nl.
     
    t(X):-q1(X),q2(X),q3(X),q4(X),q5(X),q6(X),q7(X),q8(X),q9(X),q10(X).
    t2(X):-q1(X);q2(X);q3(X);q4(X);q5(X);q6(X);q7(X);q8(X);q9(X);q10(X).
     
     
    tata(Mel,Lea):-oncle(Ben,Lea),couple(Ben,Mel).
    Pour le programme de coktail, je vais reprendre en utilisant abondamment votre aide. Pour "l'instant" juste une question : les recettes peuvent elles avoir un nombre différents d'ingédients .

    Merci encore .

    Maurice.

  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
    Citation Envoyé par darderos Voir le message
    Pour "l'instant" juste une question : les recettes peuvent elles avoir un nombre différents d'ingédients .
    Oui bien sur.
    "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
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2015
    Messages : 12
    Points : 5
    Points
    5
    Par défaut aie aie aie
    Je viens de m'y remettre et ça commence mal.

    lorsque je teste :

    realisable(X,Y).
    ERROR: forall/2: Undefined procedure: ??? / 0
    Exception: (8) ??? ? No previous search
    Exception: (8) ??? ? creep

    j'obtiens ça .

    autre question :
    coktail ne peut il pas être construit à partir de ingrédients ?
    encore merci.

  6. #6
    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 darderos Voir le message
    lorsque je teste :

    realisable(X,Y).
    ERROR: forall/2: Undefined procedure: ??? / 0
    Exception: (8) ??? ? No previous search
    Exception: (8) ??? ? creep

    j'obtiens ça .
    Réponse là :

    Citation Envoyé par pcaboche Voir le message
    Je vous laisse compléter le prédicat realisable/2 (indice : allez voir du côté des prédicats member/2 et memberchk/2).
    Il faut compléter la ligne :
    Pour cela, il suffit de traduire (quasiment mot pout mot) la phrase suivante : "pour tout ingredient 'I' faisant partie de la recette, 'I' doit être présent dans la liste des ingrédients disponibles".
    "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...

  7. #7
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2015
    Messages : 12
    Points : 5
    Points
    5
    Par défaut aie aie suite
    Citation Envoyé par pcaboche Voir le message
    Réponse là :



    Il faut compléter la ligne :
    Pour cela, il suffit de traduire (quasiment mot pout mot) la phrase suivante : "pour tout ingredient 'I' faisant partie de la recette, 'I' doit être présent dans la liste des ingrédients disponibles".
    je croyais avoir compris j'ai fait:
    i
    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
    ngredients( punch,    [rhum, sucre]).
    ingredients( gin_fizz, [gin, tonic]).
    ingredients( anis,     [ricard, eau]).
    ingredients( potion_pour_lendemain_de_fete, [eau, paracetamol] ).
     
    cocktail( punch ).
    cocktail( gin_fizz ).
    cocktail( anis ).
     
    realisable( Disponibles, Recette ) :-
        ingredients( Recette, ingredients ),
       forall( memberchk(I,ingredients),menber(I,Disponibles) ).
     
    cocktail_realisable( Disponibles, Recette ) :-
        cocktail( Recette )
      , realisable( Disponibles, Recette )
      .
    /*
    Exemple:
    cocktail_realisable( [gin, rhum, sucre, tonic], C).
    realisable( [gin, rhum, sucre, tonic], C).
    */

    j'obtiens:


    cocktail_realisable( [gin, rhum, sucre, tonic], C).
    realisable( [gin, rhum, sucre, tonic], C).false.

    je ne comprends pas .

  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
    Il faudrait penser à enclore le code des balises adéquates
    "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
    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
    Deux choses qui ne vont pas :
    1/
    - "ingredients", avec une minuscule, c'est un atome
    - "Ingredients", avec une majuscule, c'est une variable

    Il vous faut une variable.

    2/
    - member/2 énumère les éléments de la liste
    - memberchk/2 s'arrête dès que l'unification réussit (pas de backtracking) et sert donc à vérifier qu'un élément appartient à la liste (il ne retourne qu'une seule solution, même s'il existe des doublons, contrairement à member/2)

    Vous avez inversé member/2 et memberchk/2
    "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
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2015
    Messages : 12
    Points : 5
    Points
    5
    Par défaut je n'y arrive pas
    Citation Envoyé par pcaboche Voir le message
    Deux choses qui ne vont pas :
    1/
    - "ingredients", avec une minuscule, c'est un atome
    - "Ingredients", avec une majuscule, c'est une variable

    Il vous faut une variable.

    2/
    - member/2 énumère les éléments de la liste
    - memberchk/2 s'arrête dès que l'unification réussit (pas de backtracking) et sert donc à vérifier qu'un élément appartient à la liste (il ne retourne qu'une seule solution, même s'il existe des doublons, contrairement à member/2)

    Vous avez inversé member/2 et memberchk/2
    merci de votre aide , mais je n'y arrive pas.
    j'ai essayé de remplacer les variables par des lettres X,Y pour mieux comprendre (vieux retraité).

    realisable( X, Y ) :-
    ingredients( X, ingredients ),
    forall( member(X,ingredients),memberchk(X,Y) ).

    cocktail_realisable( X,Y ) :-
    cocktail( X ) , realisable( X, Y ).

    mais pas mieux,
    j'ai abuse du coktail eau, paracetamol, pas mieux.
    en fait je ne comprends pas ce que devrait contenir realisable.

    merci encore .
    .

  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
    I majuscule, pour que "Ingredients" soit une variable :

    ingredients( Recette, Ingredients ),
    , forall( member(I, Ingredients), memberchk(I, Disponibles) ).
    "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
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2015
    Messages : 12
    Points : 5
    Points
    5
    Par défaut merci
    Citation Envoyé par pcaboche Voir le message
    I majuscule, pour que "Ingredients" soit une variable :

    ingredients( Recette, Ingredients ),
    , forall( member(I, Ingredients), memberchk(I, Disponibles) ).
    un grand MERCI !

    avez vous une piste pour ma deuzieme question (hier 10h23).
    ou faut il ouvrir une deuxième discussion ?

  13. #13
    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 darderos Voir le message
    avez vous une piste pour ma deuzieme question (hier 10h23).
    ou faut il ouvrir une deuxième discussion ?
    Le truc de généalogie ?
    Oui autre discussion, car ça n'a rien à voir avec les cocktails (même si papy fait des cocktails pendant que mamie améliore sa recette de soupe aux potirons).
    "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. 2 evenements sur un seul onclick..possible ou pas
    Par michka999 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 28/08/2006, 17h01
  2. gerer lien sur image par css : possible ou pas?
    Par michka999 dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 17/08/2006, 17h01
  3. Possible ou pas ?
    Par Philippelid dans le forum Flash
    Réponses: 6
    Dernier message: 11/07/2006, 12h09
  4. [Flash][XML] Possible ou pas ?
    Par JohnBlatt dans le forum Flash
    Réponses: 1
    Dernier message: 31/01/2006, 02h25
  5. [VBA]possible ou pas ? creer une image jpg a partir 7 jpg
    Par sakuraba dans le forum Général VBA
    Réponses: 5
    Dernier message: 03/01/2006, 11h45

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