Bonjour,

J'ai un problème avec un programme principal pour passer les "paramètres" à mes prédicats.

j'ulise read_string/5 pour saisir une ligne de text ; End est le dernier caractère saisie avant "enter".
j'ulise en suite split_string/4 pour décomposer la ligne de text en liste d'atome.

Je veux passer cette liste pour traiter uniquement le premier atome ; Mes prédicats principaux sont définit de la manière suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
no([X|_], S) :- no, writeln(X), no_analyze(X, S).
yes([X|_], A) :- yes, writeln(X), yes_analyze(X, A).
Ces prédicat fonctionne depuis l'interpréteur, mais pas en interne.

Le code complet du programme principal :

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
 
affirmative(List, End) :- End == 33; End == 46.
 
interrogative(List, End) :- End == 63.
 
input_to_list(String, List) :-
    split_string(String, "-', ", ",\s", List).
 
output_to_list(String, List) :-
    split_string(String, "-', ?!.", ",\s", List).
 
 
main(R) :-
    read_string(user_input, "!.?", """\n", End, String),
    writeln(End),
    output_to_list(String, List),
    writeln(List),
    (
        affirmative(List, End) ->
            yes(List, R) ;
 
        interrogative(List, End) ->
            no(List, R)
    ).
Au cas ou vous souhaitiez tester, voici les code de la base de faits et leurs règles :

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
 
antinomie(negative, positive).
antinomie(no, yes).
antinomie(true, false).
 
 
antinomie(peace, war).
antinomie(dead, life).
 
synonyme(no, negative).
synonyme(negative, false).
 
synonyme(yes, positive).
synonyme(positive, true).
 
synonyme(affirmative, positive).
 
synonyme(love, like).
synonyme(war, dead).
synonyme(life, will).
 
search_antinomie(Left, Right) :- (antinomie(Left, Right), !
                                  ; antinomie(Right, Left)).
 
search_synonyme(Left, Right) :- (synonyme(Left, Right), !
                                 ; synonyme(Right, Left)).
 
no_analyze(X, S) :-
    writeln(X),
    (search_synonyme(X, Y),
     search_antinomie(Y, A),
     search_synonyme(A, S), !
     ;
     search_antinomie(X, S)).
 
yes_analyze(X, A) :-
    writeln(X),
    (search_antinomie(X, Y),
     search_synonyme(Y, S),
     search_antinomie(S, A), !
     ;
     search_synonyme(X, A)).
 
no :- write('no, ').
yes :- write('yes, ').

Voici un court extrait de mes commandes :

?- yes([yes], A).
yes, yes
yes
A = positive.

?- no([no], A).
no, no
no
A = true.

?- main(X).
|: yes !
33
[yes]
yes, yes
yes
false.

?- main(X).
|: no !
33
[no]
yes, no
no
false.

?-
Je n'ai aucune idée de ce qui cloche. Si vous saviez m'aider, vous m'avanceriez.

Merci.