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 :

marketing mix avec Prolog : sommes des produits.


Sujet :

Prolog

  1. #1
    Membre du Club
    Homme Profil pro
    codeur
    Inscrit en
    Mars 2018
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : Mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut marketing mix avec Prolog : sommes des produits.
    Bonjour, ayant posé une fausse question, je profite du sujet pour en poser une autre avec les même bases de code mais cette fois on lit ligne d'info depuis un fichier. Et j'ai un problème dont je ne sais donner la dercription pour le moment.
    Merci pour votre aide.


    <<message originel>>

    Bonjour,
    J'écris un autre petit programme pour me faire la main.
    il s'agit de deux prédicat dynamique mix/7 et result/3. A priori le programe ce déroule normalement, sauf un problème d'affichage que je souhaiterait comprendre et le fait que finalement le prédicat mix n'est pas ajouté.

    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
     
    :- dynamic ( mix/7 ).
    :- dynamic ( result/3).
     
    prompt(Prompt) :- prompt1(Prompt).
    message(Message) :- write(Message), nl.
    dialog(Message,
           Prompt,
           Response) :- message(Message),
                        prompt(Prompt),
                        read(Response).
     
    contact(Name) :- dialog("", "LOGON : ", Name).
     
    who(Dealer) :- dialog("Who ?", "dealer : ", Dealer).
    what(What) :- dialog("What ?", "what : ", What).
    where(Where) :- dialog("Where ?", "where : ", Where).
    when(When) :- dialog("When ?", "when : ", When).
    howto(Howto) :- dialog("How to ?", "how to : ", Howto).
    quantity(Quantity) :- dialog("How many ?", "how many : ", Quantity).
    price(Price) :- dialog("How much ?", "price : ", Price).
     
    situation(Mix) :-
        who(Dealer),
        what(What),
        where(Where),
        when(When),
        howto(Howto),
        quantity(Quantity),
        price(Price),
        assertz((mix(Dealer, What, Where, When, Howto, Quantity, Price))),
        Mix = [Dealer, What, Where, When, Howto, Quantity, Price].
     
    split([Dealer, What, Where, When, Howto, Quantity, Price],
          Dealer, What, Where, When, Howto, Quantity, Price).
     
    problem(dealer, Mix, Values)   :-
        split(Mix, Dealer, What, Where, When, Howto, Quantity, Price),
        findall(Value, mix(Value, What, Where, When, Howto, Quantity, Price), Values).
    problem(what, Mix, Values)     :-
        split(Mix, Dealer, What, Where, When, Howto, Quantity, Price),
        findall(Value, mix(Dealer, Value, Where, When, Howto, Quantity, Price), Values).
    problem(where, Mix, Values)    :-
        split(Mix, Dealer, What, Where, When, Howto, Quantity, Price),
        findall(Value, mix(Dealer, What, Value, When, Howto, Quantity, Price), Values).
    problem(when, Mix, Values)     :-
        split(Mix, Dealer, What, Where, When, Howto, Quantity, Price),
        findall(Value, mix(Dealer, What, Where, Value, Howto, Quantity, Price), Values).
    problem(howto, Mix, Values)    :-
        split(Mix, Dealer, What, Where, When, Howto, Quantity, Price),
        findall(Value, mix(Dealer, What, Where, When, Value, Quantity, Price), Values).
    problem(quantity, Mix, Values) :-
        split(Mix, Dealer, What, Where, When, Howto, Quantity, Price),
        findall(Value, mix(Dealer, What, Where, When, Howto, Value, Price), Values).
    problem(price, Mix, Values)    :-
        split(Mix, Dealer, What, Where, When, Howto, Quantity, Price),
        findall(Value, mix(Dealer, What, Where, When, Howto, Quantity, Value), Values).
     
    problem(Problem) :- dialog("What is the problem ? ", "problem : ", Problem).
     
    implication(Mix, Problem, Values) :- message("Result searching..."),
                                        problem(Problem, Mix, Values).
     
    result(Name, Mix, Problem) :- assertz((result(Name, Mix, Problem))).
     
    deal :- situation(Mix),
            problem(Problem),
            implication(Mix, Problem, Values),
            write("New values : "), write(Values), nl,
            contact(Name),
            result(Name, Mix, Problem).
    L'exécution :
    manu@ultimate:~/devel/Projects/pmix$ cat Result.txt
    ?- deal.
    Who ?
    dealer : me.
    What ?
    what : this.
    Where ?
    where : here.
    When ?
    when : now.
    How to ?
    how to : power.
    How many ?
    how many : infinite.
    How much ?
    price : free.
    What is the problem ?
    problem : when.
    Result searching...
    New values : _G1391

    LOGON : arknos.

    true.

    ?- mix(A, B, C, D, F, F, G).
    false.
    Pouriez vous m'aider à corriger mon programme ? S'il vous plait !

    Merci.

    Edit, je corrige, le code.

    << fin originel>>
    Logique sans matière est matière de logique.

  2. #2
    Membre du Club
    Homme Profil pro
    codeur
    Inscrit en
    Mars 2018
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : Mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut
    j'ai trouvé.
    j'ai cherché un moment, parce que en corrigeant au mieux, j'ai introduit un autre comportement, enfin, il m'a falue comprendre.

    Il manque simplement un s à value pour la liste résultante des findall. dans les paramètres de problem/3.

    Voilà, et ça marche, en l'état.
    Logique sans matière est matière de logique.

  3. #3
    Membre du Club
    Homme Profil pro
    codeur
    Inscrit en
    Mars 2018
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : Mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut
    Voilà, pourquoi, je ne peut pas appeller mix de la ligne de commande.

    Toujours le même problème. Bien que j'ai corrigé une faute.

    Désolé pour le repost.

    Edit, ducoup, le problème de l'affichage est résolut mais pas celui du prédicat mix.

    ?- deal.
    Who ?
    dealer : me.
    What ?
    what : [peace, and, love].
    Where ?
    where : [every, where].
    When ?
    when : [for, all, time].
    How to ?
    how to : [with, power, and, will].
    How many ?
    how many : [in, reason, and, freedom].
    How much ?
    price : free.
    What is the problem ?
    problem : when.
    Result searching...
    New values : [[for,all,time]]

    LOGON : arknos.

    true .

    ?- mix(A, B, C, D, F, F, G).
    false.

    ?- result(arknos, M, V).
    M = [me, intelligency, here, now, forever, infinite, free],
    V = quantity ;
    M = [me, [peace, and, love], [every, where], [for, all, time], [with, power, and, will], [in, reason, and|...], free],
    V = when.

    ?- mix(A, B, C, D, F, F, G).
    false.

    ?-
    Logique sans matière est matière de logique.

  4. #4
    Membre du Club
    Homme Profil pro
    codeur
    Inscrit en
    Mars 2018
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : Mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut Et voilà que ça fonctionne.
    Bonjour,


    Je m'aperçois que je prédicat mix/7 joue bien son rôle.
    J'ai du mal utiliser le programme.

    Voilà un sujet de plus résolu.

    Merci pour votre aide ou votre soutiens, merci à Trap_D encore.

    Edit, à oui, j'avais inseré deux fois le 'F' dans ma requête. Aben voilà.

    Désolé. Vraiment désolé.
    Logique sans matière est matière de logique.

  5. #5
    Membre du Club
    Homme Profil pro
    codeur
    Inscrit en
    Mars 2018
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : Mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut
    Bonjour, J'ai modifier le tritre pour profiter du sujet.

    Je souhaite à présent lire les information contenues dans ma base depuis un fichier texte :
    Ce sont mes dépenses :

    ?- init.
    Reading database...
    arknos, 'Srf', [téléphone, mobile], 'France', [2018, 2019], virement, 12, 56, price
    arknos, 'Free', 'Internet', 'France', [2018, 2019], virement, 12, 36, price
    arknos, 'EDF', 'éléctricité', 'France', [2018, 2019], virement, 12, 40, price
    arknos, 'GDF', gaz, 'France', [2018, 2019], virement, 12, 10, price
    arknos, 'Loyer', habitation, 'France', [2018, 2019], virement, 12, 85, price

    true ;
    [_G1307,_G1310,_G1313,_G1316,_G1319,_G1322,_G1325]
    ERROR: </2: Arguments are not sufficiently instantiated
    ?

    Voici mon code pour lire le ficher :

    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
    problem_split([Name, Dealer, What, Where, When, Howto, Quantity, Price, Problem\
    ], Name, [Dealer, What, Where, When, Howto, Quantity, Price], Problem).
     
    read_file(Stream,[X|L], Size, N) :-
        read_string(Stream, "", "\r\t", Code, X),
        writeln(X),
        split_string(X, ' ', "", List);
        problem_split(List, Name, Mix, Problem),
        split(Mix, Dealer, What, Where, When, Howto, Quantity, Price),
        assertz((mix(Dealer, What, Where, When, Howto, Quantity, Price))),
        write(Mix), nl,
        %% implication(Mix, Problem, Values),                                       
        %% write("New values : "), write(Values), nl,                               
        problem(Name, Mix, Problem),
        (N < Size ->
             J is N + 1,
             read_file(Stream, L, Size, J)
         ;
         true).
     
     
    situations(Filename, L) :- open(Filename, read, Stream),
                               read_file(Stream, L, Size, I),
                               close(Stream).
     
    init :- writeln("Reading database..."),
            Size is 5,
            I is 1,
            situations("situations.txt", L).
    Pouvez vous m'aider ? S'il vous plait ! Merci.

    edit, je corrige un "\n" mal placé dans read_string et ne correspondant pas au résultat donné.
    edit 2 : et j'ai reforaté mon fichier, ou plutôt déformaté mon fichier tel que comme suit :
    arknos, Srf, mobil-phone, France, 2018-2019, virement, 12, 56, price
    arknos, Free, Internet, France, 2018-2019, virement, 12, 36, price
    arknos, EDF, éléctricité, France, 2018-2019, virement, 12, 40, price
    arknos, GDF, gaz, France, 2018-2019, virement, 12, 10, price
    arknos, Loyer, habitation, France, 2018-2019, virement, 12, 85, price
    Logique sans matière est matière de logique.

  6. #6
    Membre du Club
    Homme Profil pro
    codeur
    Inscrit en
    Mars 2018
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : Mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut stream do not exit : at_end_of_string.
    J'ai réussi à chargé mon ficher.
    Cependant j'aboutie sur une erreur durant l'exécution :

    ?- init.
    Reading database...
    arknos Srf mobil-phone France 2018-2019 virement 12 56 price
    [arknos,Srf,mobil-phone,France,2018-2019,virement,12,56,price]
    name : arknos
    mix : [Srf,mobil-phone,France,2018-2019,virement,12,56]
    problem : price
    [Srf,mobil-phone,France,2018-2019,virement,12,56]
    Result searching...
    New values : [56]
    arknos Free Internet France 2018-2019 virement 12 36 price
    [arknos,Free,Internet,France,2018-2019,virement,12,36,price]
    name : arknos
    mix : [Free,Internet,France,2018-2019,virement,12,36]
    problem : price
    [Free,Internet,France,2018-2019,virement,12,36]
    Result searching...
    New values : [36]
    arknos EDF éléctricité France 2018-2019 virement 12 40 price
    [arknos,EDF,éléctricité,France,2018-2019,virement,12,40,price]
    name : arknos
    mix : [EDF,éléctricité,France,2018-2019,virement,12,40]
    problem : price
    [EDF,éléctricité,France,2018-2019,virement,12,40]
    Result searching...
    New values : [40]
    arknos GDF gaz France 2018-2019 virement 12 10 price
    [arknos,GDF,gaz,France,2018-2019,virement,12,10,price]
    name : arknos
    mix : [GDF,gaz,France,2018-2019,virement,12,10]
    problem : price
    [GDF,gaz,France,2018-2019,virement,12,10]
    Result searching...
    New values : [10]
    arknos Loyer habitation France 2018-2019 virement 12 85 price
    [arknos,Loyer,habitation,France,2018-2019,virement,12,85,price]
    name : arknos
    mix : [Loyer,habitation,France,2018-2019,virement,12,85]
    problem : price
    [Loyer,habitation,France,2018-2019,virement,12,85]
    Result searching...
    New values : [85]
    true ;
    New values : _G1901
    ERROR: at_end_of_stream/1: stream `<stream>(0x55b42286e200)' does not exist
    Exception: (14) read_file(<stream>(0x55b42286e200), _G1809, _G1954, _G1955) ?
    Je pense que j'ai un problème avec la fin de lecture du fichier. Mais je sais pas le résoudre. J'ai bien essayé mais ça marchais pas.

    Voici mes nouveaux codes de read_file :

    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
    read_file(Stream,[X|L]) :- \+ at_end_of_stream(Stream),
                                        read_string(Stream, "\n", "\r\t", Code, X),
                                        writeln(X),
                                        atomic_list_concat(List, ' ', X),
                                        writeln(List),
                                        problem_split(List, Name, Mix, Problem),
                                        write("name : "), writeln(Name),
                                        write("mix : "), writeln(Mix),
                                        write("problem : "), writeln(Problem),
                                        split(Mix, Dealer, What, Where, When, Howto, Quantity, Price),
                                        assertz((mix(Dealer, What, Where, When, Howto, Quantity, Price))),
                                        write(Mix), nl,
                                        implication(Mix, Problem, Values),
                                        write("New values : "), write(Values), nl, 
                                        problem(Name, Mix, Problem),               
                                        read_file(Stream, L).
     
     
    read_file(Stream,[]) :-
        at_end_of_stream(Stream).

    Vous sauriez comment je peux arrêter la lecture en fin de fichier ou au bout de N iteration ?

    S'il vous plait !
    Logique sans matière est matière de logique.

  7. #7
    Membre du Club
    Homme Profil pro
    codeur
    Inscrit en
    Mars 2018
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : Mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut j'ai réussie !!!
    j'ai réussie, avec un foreach.

    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
    new_deal(Stream, Index) :-
        read_string(Stream, "\n", "\r\t", Code, X),
        writeln(X),
        atomic_list_concat(List, ' ', X),
        writeln(List),
        problem_split(List, Name, Mix, Problem),
        write("name : "), writeln(Name),
        write("mix : "), writeln(Mix),
        write("problem : "), writeln(Problem),
        split(Mix, Dealer, What, Where, When, Howto, Quantity, Price),
        assertz((mix(Dealer, What, Where, When, Howto, Quantity, Price))),
        write(Mix), nl,
        implication(Mix, Problem, Values),
        write("New values : "), write(Values), nl,
        problem(Name, Mix, Problem).
     
     
     
    read_file(Stream, Size, N) :- /* \+ at_end_of_stream(Stream), */
        foreach(between(N, Size, Index),
                new_deal(Stream, Index)).
     
     
     
    situations(Filename, L) :- open(Filename, read, Stream),
                               Size is 5,
                               I is 1,
                               read_file(Stream, Size, I),
                               close(Stream).
    Bon, il faut connaître la taille de ce que l'on lit.

    Je suis preneur pour une solution plus efficace toujours.

    Merci.


    Pour être complet, j'ai supprimeé jusqu'aux vurgules dans mon fichier.

    Il reste que des espaces.
    Logique sans matière est matière de logique.

  8. #8
    Membre du Club
    Homme Profil pro
    codeur
    Inscrit en
    Mars 2018
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : Mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut Sommes des produits
    Bonjour,

    Je souhaite faire des sommes de produits.
    Pour le faire j'ai un prédicat produit/3 qui fait le produit de deux nombres.
    Je cherche comment écrire le prédicat "sum/3" pour faire les sommes des produits.

    Voici mon code : les prédicat analyze et bilan permettent d'extraire les valeurs à multiplier afin d'en sommer les produit.

    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
    sum(T, S , Sum) :- Sum is T + S.
     
    produit(Q, P, T) :- T is P * Q.
     
    analyze(L, Index, Prob, Sum) :-
        writeln("Analyze : "),
        nth0(Index, L, Element),
        writeln(Element),
        split(Element, Dealer, What, Where, When, Howto, Quantity, Price),
        write("Quantity : "), writeln(Quantity),
        write("Price : "), writeln(Price),
        atom_number(Quantity, Q),
        atom_number(Price, P),
        produit(Q, P, Total),
        write("Total = "), writeln(Total),
        sum(Total, Sum, Sum),
        write("Sum = "),
        writeln(Sum).
     
    bilan(Name, Problem, Sum) :-
        findall(X, result(Name, X, Problem), L),
        length(L, L_Length),
        foreach(between(1, L_Length, Index),
                analyze(L, Index, Problem, Sum)).
    Une erreur survien dès la première iteration de analyze au moment de faire la somme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ?- bilan(arknos, price, X).
    Analyze : 
    [Free,Internet,France,2018-2019,virement,12,36]
    Quantity : 12
    Price : 36
    Total = 432
    ERROR: is/2: Arguments are not sufficiently instantiated
    ?-

    Merci pour votre aide.
    Logique sans matière est matière de logique.

  9. #9
    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

    Pour la lecture de fichier data, la bibliothèque CSV de SWI-Prolog peut-être intéressante.
    Pour l'erreur de calcul, afficher P et Q pour voir.
    "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

  10. #10
    Membre du Club
    Homme Profil pro
    codeur
    Inscrit en
    Mars 2018
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : Mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut
    Bonjour,

    Attention 'listing".

    ?- bilan(arknos, price, Sum).
    Analyze :
    [Srf,mobil-phone,France,2018-2019,virement,12,56]
    Quantity : 12
    Price : 56
    P : 56
    Q : 12
    Total = 672
    Analyze :
    [Free,Internet,France,2018-2019,virement,12,36]
    Quantity : 12
    Price : 36
    P : 36
    Q : 12
    Total = 432
    Analyze :
    [EDF,éléctricité,France,2018-2019,virement,12,40]
    Quantity : 12
    Price : 40
    P : 40
    Q : 12
    Total = 480
    Analyze :
    [GDF,gaz,France,2018-2019,virement,12,10]
    Quantity : 12
    Price : 10
    P : 10
    Q : 12
    Total = 120
    Analyze :
    [Loyer,habitation,France,2018-2019,virement,12,85]
    Quantity : 12
    Price : 85
    P : 85
    Q : 12
    Total = 1020
    true.
    Merci pour la documentation.



    Je pourrait bien faire une sommes récursive sur une liste si seulemetn je pervenais à ajouter le Total à une liste, mais Prolog me dit que les éléments ne sont pas suffisemment instaciés.
    Logique sans matière est matière de logique.

  11. #11
    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
    Je viens de repérer un "bug" dans le code :
    between(1, Length, Index) fournit tous les nombres de 1 à Length.
    nth0(Index, L, Element), recherche les éléments d'une liste par leur numéro d'ordre, certe mais nth0/3 commence à 0 et s'arrête à Length-1. (c'est nth1/3 qui recherche de 1 à Length)
    Celà ne corrigera pas peut-être pas l'erreur mais une erreur sera supprimée.
    "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

  12. #12
    Membre du Club
    Homme Profil pro
    codeur
    Inscrit en
    Mars 2018
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : Mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut
    j'ai ôté 1 à Length et commencé le between à 0, (j'utilise après nth0).
    Merci pour le coup d'oeil.
    Logique sans matière est matière de logique.

  13. #13
    Membre du Club
    Homme Profil pro
    codeur
    Inscrit en
    Mars 2018
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : Mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut construction de la lise des opérande des sommes
    Bonsoir,

    j'ai avancé peut-être un peu,, j'essaie une autre méthode pour récupérer la liste et faire la somme après.
    Du coup le jeu consite à ajouter les Totaux à la liste.

    je parviens à mettre une l'atom 0 dans une la liste résultant.
    Mais d'une par, il n'y a q'un unique 0, d'autre par, je ne peux pas mettre Total, ni T dans cette liste à la place de 0.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    add_to([], E, List) :- List = [E].
    add_to([L], E, List) :- List = [L, E].
    L'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        add_to(Sum, 0, Sum).
    Merci pour vos lumières.
    Logique sans matière est matière de logique.

  14. #14
    Membre du Club
    Homme Profil pro
    codeur
    Inscrit en
    Mars 2018
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : Mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut
    Vaut mieux pas que vous voyez en fait.

    Comme ça, c'est déjà mieux, j'arrive à mettre un Total dans la list Sum.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    add_to(_, E, [E]).
    add_to([L], _, [L|_]).
    Logique sans matière est matière de logique.

  15. #15
    Membre du Club
    Homme Profil pro
    codeur
    Inscrit en
    Mars 2018
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : Mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut je ne parviens ni a ajouter les éléments des sommes à une liste, ni a faire les sommes
    Bonjour,

    Ca fait trois jours que je suis dessus.
    Je ne parviens ni a jouter les éléments des sommes dans une liste, ni à faire les sommes.

    Je poste mon dernier code complet au cas ou ça intéresse quelqu'un de m'aider.

    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
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
     
    /*                                                                            *\
    /
    /*                                 Solution                                   *\
    /
    /*                                                                            *\
    /
    /*                               Version 1.1.1b                               *\
    /
    /*                                                                            *\
    /
    /******************************************************************************\
    /
    /* Date        : 2018-03-27 04:00:00                                          *\
    /
    /* Author      : Arknos                                                       *\
    /
    /* Version     : 1.1.1b                                                        \
    */
    /* Description : S.P.I.R. solution                                            *\
    /
    /******************************************************************************\
    /
     
    :- dynamic ( mix/7 ).
    :- dynamic ( result/3).
     
    prompt(Prompt) :- prompt1(Prompt).
    message(Message) :- write(Message), nl.
    dialog(Message,
           Prompt,
           Response) :- message(Message),
                        prompt(Prompt),
                        read(Response).
     
    contact(Name) :- dialog("", "LOGON : ", Name).
     
    who(Dealer) :- dialog("Who ?", "dealer : ", Dealer).
    what(What) :- dialog("What ?", "what : ", What).
    where(Where) :- dialog("Where ?", "where : ", Where).
    when(When) :- dialog("When ?", "when : ", When).
    howto(Howto) :- dialog("How to ?", "how to : ", Howto).
    quantity(Quantity) :- dialog("How many ?", "how many : ", Quantity).
    price(Price) :- dialog("How much ?", "price : ", Price).
     
     
    situation(Mix) :-
        who(Dealer),
        what(What),
        where(Where),
        when(When),
        howto(Howto),
        quantity(Quantity),
        price(Price),
        assertz((mix(Dealer, What, Where, When, Howto, Quantity, Price))),
        Mix = [Dealer, What, Where, When, Howto, Quantity, Price].
     
     
    split([Dealer, What, Where, When, Howto, Quantity, Price],
          Dealer, What, Where, When, Howto, Quantity, Price).
     
     
    problem(dealer, Mix, Values)   :-
        split(Mix, Dealer, What, Where, When, Howto, Quantity, Price),
        findall(Value,
                mix(Value, What, Where, When, Howto, Quantity, Price), Values).
    problem(what, Mix, Values)     :-
        split(Mix, Dealer, What, Where, When, Howto, Quantity, Price),
        findall(Value,
                mix(Dealer, Value, Where, When, Howto, Quantity, Price), Values).
    problem(where, Mix, Values)    :-
        split(Mix, Dealer, What, Where, When, Howto, Quantity, Price),
        findall(Value,
                mix(Dealer, What, Value, When, Howto, Quantity, Price), Values).
    problem(when, Mix, Values)     :-
        split(Mix, Dealer, What, Where, When, Howto, Quantity, Price),
        findall(Value,
                mix(Dealer, What, Where, Value, Howto, Quantity, Price), Values).
    problem(howto, Mix, Values)    :-
        split(Mix, Dealer, What, Where, When, Howto, Quantity, Price),
        findall(Value,
                mix(Dealer, What, Where, When, Value, Quantity, Price), Values).
    problem(quantity, Mix, Values) :-
        split(Mix, Dealer, What, Where, When, Howto, Quantity, Price),
        findall(Value,
                mix(Dealer, What, Where, When, Howto, Value, Price), Values).
    problem(price, Mix, Values)    :-
        split(Mix, Dealer, What, Where, When, Howto, Quantity, Price),
        findall(Value,
                mix(Dealer, What, Where, When, Howto, Quantity, Value), Values).
     
    problem(Problem) :- dialog("What is the problem ? ", "problem : ", Problem).
     
    implication(Mix, Problem, Values) :- message("Result searching..."),
                                         problem(Problem, Mix, Values).
     
    problem(Name, Mix, Problem) :- assertz((result(Name, Mix, Problem))).
     
    problem_split([Name, Dealer, What, Where, When, Howto, Quantity, Price, Problem],
                  Name, [Dealer, What, Where, When, Howto, Quantity, Price], Problem).
     
    split([Name, Mix, Problem], Name, Mix, Problem).
     
     
    new_deal(Stream, Index) :-
        read_string(Stream, "\n", "\r\t", Code, X),
        atomic_list_concat(List, ' ', X),
        writeln(List),
        problem_split(List, Name, Mix, Problem),
        write("name : "), writeln(Name),
        write("mix : "), writeln(Mix),
        write("problem : "), writeln(Problem),
        split(Mix, Dealer, What, Where, When, Howto, Quantity, Price),
        assertz((mix(Dealer, What, Where, When, Howto, Quantity, Price))),
        implication(Mix, Problem, Values),
        write("New values : "), write(Values), nl,
        problem(Name, Mix, Problem).
     
     
    read_file(Stream, Size, N) :-
        foreach(between(N, Size, Index),
                new_deal(Stream, Index)).
     
     
     
    situations(Filename, L) :- open(Filename, read, Stream),
                               Size is 5,
                               I is 1,
                               read_file(Stream, Size, I),
                               close(Stream).
     
     
    deal :- situation(Mix),
            problem(Problem),
            implication(Mix, Problem, Values),
            write("New values : "), write(Values), nl,
            contact(Name),
            problem(Name, Mix, Problem).
     
    init :- writeln("Reading database..."),
            situations("situations.txt", L).
     
    produit(Q, P, T) :- T is P * Q.
    sum(T1, T2, Sum) :- Sum is T1 + T2.
     
    analyze2(L, Index, Sum) :-
        writeln("Analyze : "),
        nth0(Index, L, Element),
        writeln(Element),
        nth1(1, Element, Quantity),
        nth1(2, Element, Price),
        atom_number(Quantity, Q),
        atom_number(Price, P),
        produit(Q, P, Total),
        write("Total = "), writeln(Total),
        append([Total], Sum).
     
     
     
    element_sum(List, Index, Total) :-
        write("nth0 : "),
        writeln(Index),
        nth0(Index, List, P),
        writeln("atom_number"),
        atom_number(P, Produit),
        sum(0, Produit, Total),
        write("Total = "),
        writeln(Total).
     
    list_sum([], 0) :- !.
    list_sum([T|Q], Sum) :-
        list_sum(Q, S),
        sum(T, S, Sum).
     
    bilan(Name, Problem, Total) :-
        findall([Quantity, Price],
                result(Name,
                       [Dealer, What, Where, When, Howto, Quantity, Price],
                       Problem),
                L),
        length(L, L_Length),
        Last is L_Length - 1,
        append([], T, R),
        foreach(between(0, Last, Index),
                (analyze2(L, Index, Sum))),
     
        length(Sum, S_Length),
        write("Sum_Length : "),
        writeln(S_Length),
        (S_Length == L_Length ->
             true),
        %% S_Last is S_Length - 1,                                                  
        %% foreach(between(0, S_Last, S_Index),                                     
        %%      (element_sum(Sum, S_Index, Total))).                                
        list_sum(Sum, Total).
    Mon fichier situations.txt :

    arknos Srf mobil-phone France 2018-2019 virement 12 56 price
    arknos Free Internet France 2018-2019 virement 12 36 price
    arknos EDF éléctricité France 2018-2019 virement 12 40 price
    arknos GDF gaz France 2018-2019 virement 12 10 price
    arknos Loyer habitation France 2018-2019 virement 12 85 price
    Pour utiliser ce programme, il faut,
    Soit effectuer un ensemble de requête avec le prédicat deal/0 ;
    Soit utiliser le prédicar init/0 pour charger le fichier "situations.txt"

    Un fois la base de fait initialisée, je souhaiterais faire les sommes des Produits (Quantité * Price).
    J'ai fait les produits avec les prédicats bilan et analyze2

    Mes requêtes Prolog sont les suivantes :
    -? init.
    -? bilan(arknos, price, X).

    J'ai essayé de construire une liste dans analyze2, sans succès.

    Un autre méthode peut-être ?

    Merci pour votre aide.
    Logique sans matière est matière de logique.

  16. #16
    Membre du Club
    Homme Profil pro
    codeur
    Inscrit en
    Mars 2018
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : codeur

    Informations forums :
    Inscription : Mars 2018
    Messages : 158
    Points : 64
    Points
    64
    Par défaut Sommes des produits.
    Bonjour, ou re- bonjour.
    Juste pour donner ma solution.


    Bilan :
    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
    bilan(Name, Problem, Total) :-
        findall([Quantity, Price],
                result(Name,
                       [Dealer, What, Where, When, Howto, Quantity, Price],
                       Problem),
                L),
     
        length(L, L_Length),
        Last is L_Length - 1,
        length(List, L_Length),
        foreach(between(0, Last, Index),
                (analyze2(L, Index, List))),
     
        list_sum(List, Total),
        write("Total = "), writeln(Total).
    Analyze :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    analyze2(L, Index, List) :-
        writeln("Analyze : "),
        nth0(Index, L, Element),
        writeln(Element),
        nth1(1, Element, Quantity),
        nth1(2, Element, Price),
        write("Quantity : "), writeln(Quantity),
        write("Price : "), writeln(Price),
        atom_number(Quantity, Q),
        atom_number(Price, P),
        nth0(Index, List, T),
        produit(Q, P, T),
        write("Total = "), writeln(T).

    Trap_D si vous détectez un bug possible, je suis preneur.

    Merci.

    Edit : une ligne de trop dans le code.
    Logique sans matière est matière de logique.

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

Discussions similaires

  1. Développer avec Prolog
    Par nikles007 dans le forum Prolog
    Réponses: 18
    Dernier message: 30/07/2010, 11h04
  2. Interfacer Delphi avec Prolog
    Par moi89 dans le forum Outils
    Réponses: 1
    Dernier message: 11/04/2008, 22h32
  3. arrondir un chiffre avec Prolog
    Par Seb981 dans le forum Prolog
    Réponses: 2
    Dernier message: 17/05/2007, 00h00
  4. Peut-on programmer un morpion avec Prolog ?
    Par c_khadi dans le forum Prolog
    Réponses: 1
    Dernier message: 16/12/2006, 22h37

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