Prolog中的简化

Prolog中的简化,prolog,Prolog,这是一个简单的小程序,可以简化查询的加法表达式。我似乎不知道如何完成它。当我询问以下问题时: sim(sum(sum(x,1),5),Val,[x:X]). 我的结果是Val=X+1+5。我希望它能简化到X+6 代码如下: sim(Var, Value, Lst) :- member(Var:Value, Lst). sim(Num, Num, _) :- number(Num). sim(sum(Left, Right), Value, Lst) :- sim(Left, Le

这是一个简单的小程序,可以简化查询的加法表达式。我似乎不知道如何完成它。当我询问以下问题时:

sim(sum(sum(x,1),5),Val,[x:X]).  
我的结果是Val=X+1+5。我希望它能简化到X+6

代码如下:

sim(Var, Value, Lst) :- member(Var:Value, Lst).
sim(Num, Num, _) :- number(Num).
sim(sum(Left, Right), Value, Lst) :-
     sim(Left, LeftVal, Lst),
     sim(Right, RightVal, Lst),
     so(Value,LeftVal,RightVal).

so(Result, X, Y) :-
   number(X),
   number(Y), !,
   Result is X + Y.

so(Result, X, Y) :-         // debugging        so(Result,_,Y) :-
   Result = X + Y.          // Y value             write(Y), Result = Y.       
我所知道的是,我的程序试图在添加X+1和5之前简化X+1。当我将so方法的最后一行更改为只为结果提供Y时,我得到Val=6。在这一行之前,为了调试的目的,我在屏幕上写Y,由于递归,它给了我15。这意味着X必须是一个var?是否有一个角落的情况下,不在这里,将允许我简化加法所有的方式下来


我注意到的是,so从不将1和5相加,因为在so方法中,它们从来都不是参数,检查X和Y是否为数字。X和1是第一个参数,然后在递归时,X+1和5是参数,它不会执行,因为当X为X+1时numberX失败。展开上面的注释:是一个表达式简化器的示例,它使用两个列表将“符号”与“值”分开


请注意,在解析和解算时,它如何使用这样一个事实,即连接符号和值的唯一运算符是+。

我认为您可能需要一种更为可靠的机制,使用规范范式的表达式。您可以看看CLP库如何实现简化以获得灵感。如果我没记错的话,SWI prolog的CLPR包基本上和你做的一样,但是'sim'会生成正常形式的表达式,而'so'会将两个这样的表达式合并成另一个正常形式的表达式。@vmg是的,我只是看了一下CLP库,所以在这种情况下,如果有参数X,即X+1和Y,5岁时,我应该把它们放在一个表达式中?不,我的意思是你可能必须定义一个表达式的“内部表示”,处理“变量”和数字,这样你就可以把它们从其他表达式中分离出来。如果您只想处理加法,那么表示应该很简单:只需使用两个列表。如果你混合和匹配多个操作符,可能需要更复杂的方法。我明白了,我将尝试利用该解决方案中发生的事情,希望得到我的解决方案,看看我能想出什么。