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 :
Ces prédicat fonctionne depuis l'interpréteur, mais pas en interne.
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).
Le code complet du programme principal :
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 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) ).
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 :
Je n'ai aucune idée de ce qui cloche. Si vous saviez m'aider, vous m'avanceriez.?- 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.
?-
Merci.
Partager