我正在尝试在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 = ......的那个)
答案 0 :(得分:2)
Prolog系统通常不会在编译文件时保存变量的名称。对于Prolog编译器和运行时,变量 names 不相关,重要的是变量 sharing (在诸如子句的术语中)。例如,Prolog编译器将为以下子句生成相同的代码:
foo(X, Y, X).
foo(A, B, A).
foo(Bar, _, Bar).
但前两个条款会导致单身警告。
您发布的代码编译最有可能导致单例变量警告。例如,对于rule/3
谓词的第四和第五个子句。单例警告可能来自程序员错误,其中变量名称拼写错误,或者来自真正的单例变量,然后可以用匿名变量_
替换。
此外,您发布的代码缺少某些谓词的定义,例如unify/2
,这会阻止尝试重现查询结果。