J'essaye de coder un vérificateur de confluence dans Prolog pour une affectation. Cette partie du code est en charge de créer les paires critiques et fonctionne correctement autant que je peux voir. Le problème est que chaque fois que nous appelons la fonction principale "superpose" nous obtenons les noms internes des variables (commençant par _G) et non les X, Y, Z, etcetera. Par exemple:Nom de variable interne Prolog retournant dans Confluence Checker
?- superpose(4,12,Q).
_G6993+ee+_G6991[e,_G6991,e+_G6991]
Q = [e+ (_G6993+e), 1] .
Et je voudrais voir la réponse en termes de X, Y, Z, etcetera; plutôt que _G84119. Existe-t-il un moyen simple d'y parvenir? Merci d'avance.
rule(1,e+X, X).
rule(2,Y+f, Y).
rule(3,parent(parent(Z)), grandparent(Z)).
rule(4,e+X,1).
rule(12,Y+e,1).
rule(5,0+X,X).
rule(7,((-Y)+Y),0).
rule(9,Y+Y,0).
rule(10,X+X,X).
rule(11,(X+Y)+Z,X+(Y+Z)).
get_Subterms(Expression, PartialResult, Result):-
atom(Expression),!,
Result= [Expression|PartialResult].
get_Subterms(Expression, PartialResult, Result):-
var(Expression),!,
Result= [Expression|PartialResult].
get_Subterms(Expression, PartialResult, Result):-
Expression =.. [_, SubExpA],
get_Subterms(SubExpA,[],PartResA),
append(PartResA, [Expression|PartialResult], Result),
!.
get_Subterms(Expression, PartialResult, Result):-
!,
Expression =.. [_, SubExpA, SubExpB],
get_Subterms(SubExpA,[],PartResA),
get_Subterms(SubExpB,[],PartResB),
append(PartResA, PartResB, PartResC),
append(PartResC, [Expression|PartialResult], Result).
superpose(RuleN, RuleM, CriticalPair):-
rule(RuleN,L1,R1),
rule(RuleM,L2, _),
get_Subterms(L1,[],Bits),
match(Bits,L2),
CriticalPair=[L1,R1].
match([],_,_,_):-
false.
match([Head|Tail],Target):-
Tail=[],
unify(Head,Target).
match([Head|Tail],Target):-
Tail\=[],
unify(Head,Target)
; match(Tail,Target).
---- ---- ACTUALISATION
j'ai réussi à obtenir un meilleur rendement avec:
superpose(RuleN, RuleM, CriticalPair):-
rule(RuleN,L1,R1),
rule(RuleM,L2, R2),
get_Subterms(L1,[],Bits),
match(Bits,L2),
CriticalPair=[L1,R1],
portray_clause(CriticalPair).
?- superpose(1,2,C).
[e+ (A+f), A+f].
C = [e+ (_G9035+f), _G9035+f]
est-il un moyen de seconde de Prolog "calme" sortie? (celui avec le C = ...)
Si par "silencieux" vous voulez dire ne pas afficher la liaison C alors utilisez juste "superpose (1,2, _)" comme requête. – gusbro
Thaaaanks, qui a fait l'affaire –