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 :

Nombre de prédicats vérifiés


Sujet :

Prolog

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Nombre de prédicats vérifiés
    bonjour

    j'ai un prédicat qui est codé de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    eleve("marie").
    eleve("maria").
    eleve("louis").
    eleve("damien").
    Dans un autre prédicat qui s'appelle nb, je voudrais savoir combien de variables X vérifie le prédicat elève. Comment pourrais-je faire ?

  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
    Tu peux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nbSol(Nb) :-
      findall(X, predicat(X), L),
      length(L, Nb).
    Mais le problème, c'est que ça créé une liste des solutions (ce qui utilise potentiellement beaucoup de mémoire) juste pour en connaître la taille.

    Il y a d'autres manières de faire plus ou moins capilo-tractées...
    "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
    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
    Et une version capilotractée, une :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    :- dynamic(nombre/1).
     
    eleve(marie).
    eleve(maria).
    eleve(louis).
    eleve(damien).
    eleve(frederic).
     
    test(Z) :-
        retractall(nombre(_)),
        assert(nombre(0)),
        forall(eleve(_), 
               (nombre(X), retract(nombre(X)), X1 is X+1, assert(nombre(X1)))),
        nombre(Z).
    "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

  4. #4
    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 Trap D
    Et une version capilotractée, une :
    C'est exactement à celle-là que je pensais, mais sur le coup de midi "il commençait à faire faim" comme on dit, donc j'ai pas voulu passer trop de temps là-dessus.
    "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...

  5. #5
    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
    Deux questions à ce propos :
    Comment faire pour passer en argument le prédicat dont on désire connaître le nombre d'éléments le vérifiant (il n' y a pas un mot pour ça ?)
    style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    nombre_d_occurences(Pre, N) :-
        retractall(nombre(_)),
        assert(nombre(0)),
        forall(Pred(_), 
               (nombre(X), retract(nombre(X)), X1 is X+1, assert(nombre(X1)))),
        nombre(Z).
    Autre question, dans cette clause, X prend successivement les valeurs 0, 1 2 3 et 4, alors que d'après ce que j'ai compris de l'unification ce n'est pas possible que X puisse prendre plusieurs valeurs successivement.
    "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

  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 Trap D
    Comment faire pour passer en argument le prédicat dont on désire connaître le nombre d'éléments le vérifiant ?
    Comme une variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nb_occur(Predicat, Nb) :-
      ...
    et après, on peut appeler le prédicat avec call/_ (il en plusieurs prédicats call/_):
    ... voire directement:
    mais c'est moins souple...




    Citation Envoyé par Trap D
    (il n' y a pas un mot pour ça ?)
    Un "callable", je crois.


    Citation Envoyé par Trap D
    Autre question, dans cette clause, X prend successivement les valeurs 0, 1 2 3 et 4, alors que d'après ce que j'ai compris de l'unification ce n'est pas possible que X puisse prendre plusieurs valeurs successivement.
    Une variable n'est pas censée changer de valeur en cours d'exécution... sauf dans le cas d'un backtrack (heureusement d'ailleurs !).

    Dans le cas d'un forall/findall/setof/bagof, il se produit plusieurs backtracks et donc on se retrouve avec plusieurs fois la variable X non unifiée. C'est par l'appel de nombre(X) que X se retrouve unifié à nouveau.
    "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
    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
    Merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    test(Predicat, Z) :-
    	retractall(nombre(_)),
    	assert(nombre(0)),
        forall(call(Predicat, _), (nombre(X), retract(nombre(X)), X1 is X+1, assert(nombre(X1)))),
        nombre(Z).
    Ça ne fonctionne pas en appelant seulement Predicat(X), il faut absolument le call.
    "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

  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
    J'ai un peu amélioré le prédicat de comptage pour le rendre plus général, pour qu'il puisse fonctionner avec des prédicats d'arité quelconque :
    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
    :- dynamic(nombre/1).
     
    eleve(marie).
    eleve(maria).
    eleve(louis).
    eleve(damien).
    eleve(frederic).
    famille(marie, louis).
    famille(damien, frederic).
     
    nb_callable(Predicat, Z) :-
        retractall(nombre(_)),
        assert(nombre(0)),
        Pred =.. Predicat,
        forall(call(Pred), (nombre(X), 
                               retract(nombre(X)), 
                               X1 is X+1, 
                               assert(nombre(X1)))),
        nombre(Z).
     
    essai :-
    	eleve(_) =.. Pred,
    	nb_callable(Pred, Z),
    	write('Nombre de faits pour eleve : '), writeln(Z),
    	famille(_,_) =.. Pred1,
    	nb_callable(Pred1, Z1),
    	write('Nombre de faits pour famille : '), writeln(Z1).
    Sortie :
    ?- essai.
    Nombre de faits pour eleve : 5
    Nombre de faits pour famille : 2
    "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. bash qui vérifie le nombre de |
    Par maserati dans le forum Shell et commandes GNU
    Réponses: 22
    Dernier message: 30/06/2013, 10h59
  2. Réponses: 1
    Dernier message: 28/07/2009, 18h13
  3. Compter le nombre d'attributs d'un prédicat
    Par Kerod dans le forum Prolog
    Réponses: 4
    Dernier message: 13/12/2007, 16h48
  4. Nombre de fichiers ouverts simultanément
    Par matrixfan dans le forum C++Builder
    Réponses: 3
    Dernier message: 27/05/2002, 17h47
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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