Bonjour,
Je dois écrire un prédicat qui permet à l'utilisateur d'initialiser la base de faits.
Je sais faire la base de fait mais comment permettre à l'utilisateur d'initialiser la base de faits.
Merci de votre aide.
Bonjour,
Je dois écrire un prédicat qui permet à l'utilisateur d'initialiser la base de faits.
Je sais faire la base de fait mais comment permettre à l'utilisateur d'initialiser la base de faits.
Merci de votre aide.
Si j'ai bien compris ce que tu veux dire, tu fais un dialogue avec un repeat.
Ce n'est pas testé mais c'est du style
Après test, il faut ajouter fail après l'assert.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 :- dynamic fait/1. initialisation :- repeat write('Nouveau fait (0 pour arrêter) '), read(X), (X \= 0 -> assert(fait(X)), fail; true).
"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
ok merci donc ce n'est pas la peine que je declare les faits un par un.
Et le X il correspond à quoi? j'ai pas compris les arguments de write
j'ai reussi a faire la base des règle en fait il fallait faire des assert(vrai(fait)) et assert(faux(fait) et faire un prédicat qui permet à l'utilisateur de mettre des faits
maintenan j'ai besoin d'aide pour faire le moteur d'inférence dont l'algo est le suivant:
Merci!
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 ça marche tant que ça marche ça ne marche pas boucle sur les Ri boucle sur les Fj non marqués si Ri est de la forme « Si Fj Alors Fk" ajouter Fk à la BdF marquer Fj ça marche sinon boucle sur les Fl si Ri est de la forme « Si Fj ^ Fl Alors » ajouter Fm = (Fj ^ Fl) à la BdF marquer Fj ça marche finsi finboucle finsi finboucle finboucle fintant
j'ai fait ces deux prédicats mais ça ne marche pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 boucle_sur_fi(Lmark,Baf,R):-not(member(X,Lmark)),repeat,(faits(X),R is "si X, alors Y" -> append(Y,Baf, [Y|Baf]), append(X,Lmark,[X|Lmark]),fail; R is "si (X,Y), alors T", faits(Y), faits(T),append([X,Y],Baf, [X,Y|Baf]), append(X,Lmark,[X|Lmark])). saturer:-repeat,regle(R),boucle_sur_fi([],[],R).
Euh, tu es sûr de cette ligne ??
append(Y,Baf, [Y|Baf]),
append permet de concaténer la liste L1 et La liste L2 pour obtenir la liste L3, par exemple append([1,2,4], [4,5,6], L) réussit et unifie L avec [1,2,3,4,5,6].
not(member(X,Lmark)), cette clause en début du prédicat boucle_sur_fi(Lmark,Baf,R), avec X unifié avec rien du tout ne peut rien donner de bon.
R is "si X, alors Y" ne passe pas en SWI-Prolog.
Peux-tu donner quelques exemples pour regle et faits pour voir un peu ce que tu cherches à faire ?
PS l'algo que tu veux coder est trop orienté impératif, boucle, il faut que tu l'adapte au récursif, le repeat à une sémantique particulière en Prolog et n'est pas vraiment adapté au genre de boucle que tu veux faire.
Par exemple, pour le saturer, tu peux faire
Ce qui fait que tu parcoureras toutes les occurences de regle(R).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 saturer:- regle(R), boucle_sur_fi([],[],R), fail.
"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
Voici ce que je cherche à faire
réaliser un moteur d’inférence d’ordre zéro, fonctionnant en chaînage avant, en régime irrévocable et monotone, et qui ne constitue pas d’ensemble de conflit (dès qu’une règle est déclenchable, elle est déclenchée).
•*Définir la base de règles grâce à un prédicat regle*:
regle(ri)*:- si(Liste de prémisses), alors(Liste de conclusions).
•*Définir un prédicat permettant à l’utilisateur d’initialiser la base de faits. On utilisera le prédicat assert pour ajouter vrai(Fait) pour les faits positifs et faux(Fait) pour les faits négatifs.
•*Définir un prédicat qui sature la base de règles et produit une trace de son fonctionnement (on pourra s’inspirer du troisième moteur d’inférence présenté en cours).
Exemple de regle:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 regle(r1):-si([fleur,graine]), alors([phanerogame]). regle(r2):-si([phanerogame,graine_nue]),alors([sapin, ombre]). regle(r3):-si([phanerogame,un_cotyledone]), alors([monocotyledone]). regle(r4):-si([phanerogame, deux_cotyledone]), alors([dicotyledone]). regle(r5):-si([monocotyledone, rhizome]), alors([muguet]). regle(r6):-si([dicotyledone]), alors([anemone]). faits([]):-!. faits([X|L]):-vrai(X),faits(L). faits([X|L]):-faux(X),faits(L).
Ce ne serait pas çà par hasard ton travail ?
"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
c'est ça mais je l'ai réussi je pense.
Tant mieux, n'oublie pas le clic sur
"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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager