这是一个简单的迷你程序,我在这里简化了查询的附加表达式。我似乎无法弄清楚如何完成它。当我查询以下内容时:
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
失败
答案 0 :(得分:0)
扩展我上面的评论:here是一个表达式简化示例,用于分隔符号'来自'价值观'使用两个列表。
注意它在解析和解析时如何使用这个事实,即连接符号和值的唯一操作符是+。