Prolog在Confluence Checker中返回内部变量名称

时间:2014-09-11 17:18:08

标签: prolog

我正在尝试在Prolog中编写汇总检查器以进行分配。这部分代码负责创建关键对,并且正如我所见,它正在正常工作。问题在于,无论何时我们调用主函数"叠加"我们得到变量的内部名称(以_G开头)而不是X,Y,Z等。例如:

?- superpose(4,12,Q).
_G6993+ee+_G6991[e,_G6991,e+_G6991]
Q = [e+ (_G6993+e), 1] .

我希望从X,Y,Z等方面看到答案;而不是_G84119。有没有一种简单的方法来实现这一目标?提前谢谢。

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

---- ---- UPDATE

我设法获得了更好的输出:

 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] 

有没有办法让#34;安静" prolog的第二个输出? (具有C = ......的那个)

1 个答案:

答案 0 :(得分:2)

Prolog系统通常不会在编译文件时保存变量的名称。对于Prolog编译器和运行时,变量 names 不相关,重要的是变量 sharing (在诸如子句的术语中)。例如,Prolog编译器将为以下子句生成相同的代码:

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

但前两个条款会导致单身警告。

您发布的代码编译最有可能导致单例变量警告。例如,对于rule/3谓词的第四和第五个子句。单例警告可能来自程序员错误,其中变量名称拼写错误,或者来自真正的单例变量,然后可以用匿名变量_替换。

此外,您发布的代码缺少某些谓词的定义,例如unify/2,这会阻止尝试重现查询结果。