Tree Can';t通过缓存/记忆停止Prolog节点的创建

Tree Can';t通过缓存/记忆停止Prolog节点的创建,tree,prolog,memcached,proof,Tree,Prolog,Memcached,Proof,如何在Prolog中记住树上的术语 我认为我的推理是好的,但是像Conversion这样的节点不断添加,创建更多具有相同先前值的节点,程序可以工作,但是我想阻止创建这些节点 name(Term,X) :- Term=..[X|_]. prop(eq,commutative). prop(and,commutative). prop(and,associative). prop(Op,P):-compound(Op),name(Op,Opname),prop(Opname,P). identit

如何在Prolog中记住树上的术语

我认为我的推理是好的,但是像Conversion这样的节点不断添加,创建更多具有相同先前值的节点,程序可以工作,但是我想阻止创建这些节点

name(Term,X) :- Term=..[X|_].
prop(eq,commutative).
prop(and,commutative).
prop(and,associative).
prop(Op,P):-compound(Op),name(Op,Opname),prop(Opname,P).

identity(A,A). %checks if both are the same, or returns the same in any parameter
commute(A,B):- A=..[N,X,Y], B=..[N,Y,X]. %true if B is commutation of A, or B outputs commutation of A
associate(X,Y):- X=..[N,A,B],B=..[N,BA,BB], Y=..[N,C,BB],C=..[N,A,BA].

:- dynamic proofcache/1.
proof(_,Steps) :- Steps<1, !, false.
proof(eq(A,B),Steps) :- identity(A,B),writeln(["id",A,"=",B,Steps]),!,true.
proof(eq(A,B),Steps) :-  prop(A,commutative),  (proofcache(eq(A,B));asserta(proofcache(eq(A,B))),  commute(A,R),writeln(["comm",A,"=",R,Steps]), proof(eq(R,B),Steps-1)).
proof(eq(A,B),Steps) :-  prop(A,associative),  (proofcache(eq(A,B));asserta(proofcache(eq(A,B))),  associate(A,R),writeln(["assoc",A,"=",R,Steps]), proof(eq(R,B),Steps-1)).

显然,问题是我在C++代码中假设分号像<代码> > <代码>,因此在<代码>之后的术语;即使前面的命题被求值为false,代码>也会被求值,因此预先添加一个割操作符修复了这个问题

由于我不熟悉该语言,可能会出现更多错误,下面是一个解决方案示例,
writeln
messages有助于查看问题,
trace
也可能有帮助

proof(eq(A,B),Steps) :- prop(A,commutative),
    (proofcache(eq(A,B),comm), writeln(["comm was cached",eq(A,B),Steps]), !;
    asserta(proofcache(eq(A,B),comm)), writeln(["comm was not cached",eq(A,B),Steps]), 
    commute(A,R), writeln(["comm",A,"=",R,Steps]),
    proof(eq(R,B),Steps-1)).

这更多的是猜测,或者如果这是我的问题评论,我个人会去哪里看,但总比什么都没有好。这似乎是一个类型问题,而不是Prolog问题。我想说这是一个问题,但我不想实际介入其中,这与你所描述的内容不符。如果你能读到Baader和Nipkow的书,应该可以填补空白。您还可以尝试将其移动到站点,搜索出现的具有可下载的Prolog代码的站点。如果你不能得到
术语重写和所有的
那么看看吧,我很想给你500分奖励,但是不要认为任何经常访问标签的人都会回答这个问题,我会没收500分。要解决这个问题,必须在Prolog中实现一个术语重写系统。
proof(eq(A,B),Steps) :- prop(A,commutative),
    (proofcache(eq(A,B),comm), writeln(["comm was cached",eq(A,B),Steps]), !;
    asserta(proofcache(eq(A,B),comm)), writeln(["comm was not cached",eq(A,B),Steps]), 
    commute(A,R), writeln(["comm",A,"=",R,Steps]),
    proof(eq(R,B),Steps-1)).