2014-09-11 1 views
2

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 = ...)

+0

Si par "silencieux" vous voulez dire ne pas afficher la liaison C alors utilisez juste "superpose (1,2, _)" comme requête. – gusbro

+0

Thaaaanks, qui a fait l'affaire –

Répondre

2

Les systèmes Prolog n'enregistrent généralement pas les noms des variables lors de la compilation d'un fichier. Pour un compilateur et une exécution Prolog, les variables noms ne sont pas pertinentes, ce qui est important est la variable partage (dans un terme tel qu'une clause). Par exemple, un compilateur Prolog va générer le même code pour les clauses suivantes:

foo(X, Y, X). 
foo(A, B, A). 
foo(Bar, _, Bar). 

Mais les deux premières clauses entraînera des avertissements singleton.

La compilation du code que vous avez publié a probablement entraîné des avertissements de variable singleton. Par exemple, pour les quatrième et cinquième clauses du prédicat rule/3. Un avertissement singleton peut résulter d'une faute de frappe du programmeur où un nom de variable est mal orthographié ou d'une vraie variable singleton, qui peut être ensuite remplacée par la variable anonyme _.

En outre, le code que vous avez publié ne contient pas la définition de certains prédicats tels que unify/2, ce qui empêche d'essayer de reproduire les résultats de la requête.