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 :

[Débutant] Manipuler des Date/Time


Sujet :

Prolog

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 13
    Points : 9
    Points
    9
    Par défaut [Débutant] Manipuler des Date/Time
    Bonjour,

    Je suis débutant et j'aimerai manipuler des dates/time dans mes prédicats.

    Par exemple avec :

    Temps1(11-03-2014,23h51m13s)
    Temps2(12-03-2014,16h41m12s)

    CalculTemps(E) :- Temps1(A,B), Temps2(C,D), E is 'à compléter'.

    J'aimerai calculer combien de temps s'est passé entre ces deux périodes.

    Que quand je tape :


    CalculTemps(E).

    E me renvoie 15h49min59s.

    Est-ce possible en Prolog s'il vous plait?

    Je pense qu'il faut utiliser une commande comme stamp_time_date mais je n'ai aucune idée de comment m'y prendre.

    Je vous remercie par avance.

    Cordialement.

  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
    Bonjour
    Ce n'est pas une réponse complète mais une aide pour le début :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    decoupe(temps(Jour, Heure), JJ, MM, AA, H, M, S) :-
    	Jour = JJ-MM-AA ,
    	atom_chars(Heure, Lst),
    	append([LH , [h], LM, [m], LS, [s]], Lst),
    	number_chars(H, LH),
    	number_chars(M, LM),
    	number_chars(S, LS).
    Ce qui donne :
    ?- decoupe(temps(11-03-2014,'23h51m13s'), JJ, MM, AA, H, M, S).
    JJ = 11,
    MM = 3,
    AA = 2014,
    H = 23,
    M = 51,
    S = 13 ;
    false.
    A partir de ça, le reste est simple.
    PS. attention à la présence des quotes pour '23h51m13s'
    "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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    Tout d'abords merci beaucoup pour ta réponse en effet ça me permet de me lancer sur l'algorithme.

    Mais je le trouve pas aussi simple ^^'

    Je me suis fixé un objectif plus simple, pouvoir calculer

    TempsEcoule(X,17:41:50,17:43:02).

    et que X me renvoie 00:01:12 .

    (pour TempsEcoule(X,Heure1,Heure2), Heure1 toujours avant Heure2).

    Voila ce que j'ai fais :

    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
     
     
    decoupe(Heure,H, M, S) :- Heure = H:M:S.
     
    secondeEcoule(Heure,Heure1,Heure2) :- 
    decoupe(Heure,H,M,S), decoupe(Heure1,H1,M1,S1), decoupe(Heure2,H2,M2,S2), 
    S2>=S1, S2 is (S+S1).
     
    secondeEcoule(Heure,Heure1,Heure2) :- 
    decoupe(Heure,H,M,S), decoupe(Heure1,H1,M1,S1), decoupe(Heure2,H2,M2,S2), 
    S2<S1, S is (60-S1+S1), M1 is (M1+1).
     
    minuteEcoule(Heure,Heure1,Heure2) :- 
    decoupe(Heure,H,M,S), decoupe(Heure1,H1,M1,S1), decoupe(Heure2,H2,M2,S2), 
    M2>=M1, M2 is (M+M1),
     
    minuteEcoule(Heure,Heure1,Heure2) :- 
    decoupe(Heure,H,M,S), decoupe(Heure1,H1,M1,S1), decoupe(Heure2,H2,M2,S2), 
    M2<M1, M is (60-M1+M2),H1 is (H1+1).
     
    heureEcoule(Heure,Heure1,Heure2) :- 
    decoupe(Heure,H,M,S), decoupe(Heure1,H1,M1,S1), decoupe(Heure2,H2,M2,S2), 
    H2>=H1, H2 is (H+H1).
     
    heureEcoule(Heure,Heure1,Heure2) :- 
    decoupe(Heure,H,M,S), decoupe(Heure1,H1,M1,S1), decoupe(Heure2,H2,M2,S2), 
    H2<H1, H is (24-H1+H2).	
     
    tempsEcoule(Heure,Heure1,Heure2) :- 
    secondeEcoule(Heure,Heure1,Heure2),minuteEcoule(Heure,Heure1,Heure2),heureEcoule(Heure,Heure1,Heure2).
    Outre le fait que j'ai un Syntax error: Operator priority clash à la ligne 13:0 dont je ne comprends pas la cause, je me demande si je n'ai pas fais une erreur dans mon raisonnement, je m'explique.

    Je pense que je dois calculer séparément les secondes, les minutes, et les heures.
    On a pas la même situation lorsque les unités de la première heure sont supérieur ou inférieur à ceux de la deuxieme heure. (exemple dans mon cas, pour les secondes, je dois retrouver S=12, donc je fais 60-50+02, et je rajoute une 'retenue' à la minute, ensuite pour les minutes c'est plus simple car l'unité de heure1 est inférieur à celui de heure2, donc M=02 car 3-(1+1).

    Bref je pense que à ce niveau là c'est bon, mais le problème doit surement se poser que lorsque je met une heure en paramètre elle se découpe bien (par exemple pour 17:41:50 j'ai bien H1=17, M1=41, S1=50) en revanche je ne pense pas que lorsque j'ai ma solution H=0, M=02, S=12, cela puisse se transformer en Heure=0:02:12, si? ^^

  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
    Tu te complques énormément la vie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    decoupe(Heure,H, M, S) :- Heure = H:M:S.
     
    tempsEcoule(Heure1,Heure2,DH:MH:SH) :-
    	decoupe(Heure1, H1, M1, S1) ,
    	decoupe(Heure2, H2, M2, S2) ,
    	T1 is H1*3600 + M1 * 60 + S1,
    	T2 is H2*3600 + M2 * 60 + S2,
    	T is T2 - T1,
    	DH is T // 3600, R1 is T mod 3600,
    	MH is R1 // 60,
    	SH is R1 mod 60.
    Evidemment ça ne donne pas le resultat sous la forme HH:MM:SS mais c'est un bon début :
    1 ?- tempsEcoule(17:41:50,17:43:02, H).
    H = 0:1:12.
    Petite remarque, en Prolog on met toujours les arguments "d'entrée" en premier et ceux de "sortie" en second.
    On peut éventuellement modifier le code pour avoir des 00:01:12 mais alors 00 et 01 ne seront plsu des nombres mais de atomes, donc tu ne pourras plus applqiué ton prédicat de découpe.
    "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
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Ah en effet j'étais parti loin !!!

    Je te remercie énormément tu me sauves la vie ! Je suis un peu déçu de ne pas avoir trouver la solution moi-même mais bon, j'arrive facilement à comprendre ce que les prédicats font mais pas à les écrire >

    Merci pour l'info aussi c'est pour le temps d’exécution c'est ça? j'ai une autre question qui a rien avoir mais je vais en profiter pour te la poser puisque tu as l'air de t'y connaître en PROLOG ^^

    Est ce que c'est possible d'afficher sur le terminal de swi prolog le nom du prédicat qui a trouvé une solution?

    par exemple dans le cas ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    fonction1(X) :- X is 1.
    fonction2(X) :- X is 2.
    fonction3(X) :- X is 3.
     
    tape(X) :- fonction1(X).
    tape(X) :- fonction2(X).
    tape(X) :- fonction3(X), if 'X is true' println 'bravo'
    (Je sais que ça marche pas mais pour que tu comprennes l'idée ah ah)

    D'afficher 'fonction3' si je met tape(3), ou le message 'bravo' , enfin quelque chose qui fait que je sais où une solution a été trouvé ? ^^

    Merci pour le temps que tu consacres à me répondre en tout cas !

  6. #6
    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 Heri75011 Voir le message
    Est ce que c'est possible d'afficher sur le terminal de swi prolog le nom du prédicat qui a trouvé une solution?
    Question intéressante qu'on pourrait généraliser à "avoir la trace des appels successifs des prédicats" (on ne parle pas de fonction en Prolog).
    C'est déjà un peu fait avec "trace" en SWI-Prolog. (je ne connais que celui-là).
    "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

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Oui mais la fonction trace m'affiche aussi trop d'informations dont je n'ai pas besoin hélas :S

    J'ai encore une question (désolé de t'harceler mais vu que j'suis tombé sur un expert j'en profite ah ah !), est ce que c'est possible de renvoyer le nombre de réponse trouvé par un prédicat?

    par exemple avec

    nombre(1);nombre(2);nombre(3),nombre(5)

    predicatQuiRenvoieLesNombresImpaires(...);

    en plus de me renvoyer 1,3 et 5, me renvoyer qu'il a trouvé 3 réponses?

    Merci

  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
    Bagof/3, setof/3 te renvoient toutes les réponses possibles, dans une liste, il n'y a plus qu'a calculer la longueur de la reponse :
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    t(L, N) :-
    	setof(I, (between(1,10,I), 0=:= I mod 2), L),
    	length(L, N).
    Réponse
    ?- t(A,B).
    A = [2,4,6,8,10],
    B = 5
    "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

Discussions similaires

  1. [Débutante] Manipuler des dates
    Par sab_etudianteBTS dans le forum Langage
    Réponses: 3
    Dernier message: 04/05/2007, 17h23
  2. [WD9] [Débutante] Manipulation des dates
    Par Ando Nelly dans le forum WinDev
    Réponses: 2
    Dernier message: 19/04/2006, 08h24
  3. Manipulations des Dates
    Par kurtc dans le forum Langage SQL
    Réponses: 11
    Dernier message: 13/04/2004, 14h39
  4. [IB6][BCB5]Manipulation des dates.
    Par Sitting Bull dans le forum SQL
    Réponses: 4
    Dernier message: 09/04/2004, 15h33
  5. Manipuler des dates...
    Par Ti Jen-tsie dans le forum Langage
    Réponses: 4
    Dernier message: 26/06/2003, 11h46

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