在Prolog中简化

时间:2014-11-18 16:14:13

标签: 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, 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写入屏幕以进行调试,由于递归,它给了我1 5。这意味着X必须是var?是否有一个角落案例不允许我一直简化添加?

我注意到的是“so”永远不会添加1和5,因为它们在“so”方法中永远不会一起参数,因为它检查X和Y是数字。 X和1是第一个参数,然后是递归X+1,5是参数,它不执行,因为当{是number(X)X+1失败

1 个答案:

答案 0 :(得分:0)

扩展我上面的评论:here是一个表达式简化示例,用于分隔符号'来自'价值观'使用两个列表。

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