这个问题在这里已有答案:
这是我遇到问题的测试复习问题 . 你如何编写一个方法来用运算符'plus','minus'和'times'来评估代数表达式 . 以下是一些测试查询:
简化(表达,结果,列表)
?- simplify(plus(times(x,y),times(3 ,minus(x,y))),V,[x:4,y:2]). V = 14
?- simplify(times(2,plus(a,b)),Val,[a:1,b:5]). Val = 12
?- simplify(times(2,plus(a,b)),Val,[a:1,b:(-5)]). Val = -8
我得到的只是这些样本查询而没有其他解释 . 但我很确定该方法应该剖析第一个参数,即代数表达式,在第三个参数(List)中用x和y代替它们的值 . 第二个参数应该是评估表达式后的结果 .
我认为其中一种方法应该是简化(V,Val,L): - 成员(V:Val,L) . 理想情况下,应该只有4种方法...但我不知道如何解决这个问题 .
到目前为止我有什么,但我不知道身体应该是什么:
simplify(Var, Value, Lst) :- member(Var:Value, Lst).
simplify(plus(Var), Value, Lst) :-
simplify(minus(Var), Value, Lst) :-
simplify(times(Var), Value, Lst) :-
我不确定第五种方法应该是什么 .
1 回答
我怀疑你是否允许自己因复杂的例子而下雪 . 你只是缺少一个基本案例,所有归纳案例都非常简单 . 你只需要一些简单的例子 . 对于初学者来说,这会带来什么回报呢?
是的,
Val = 3
. 所以让我们补充一下缺少基本情况:对归纳案例的关键见解是
plus
,minus
和times
都具有相同的递归二进制结构 . 您可以递归地将simplify
应用于双方以实现评估 . 让我们尝试另一个简单的例子:我们想要
Val = 9
. 我们需要做的就是弄清楚左边和右边的值是什么,并将它们相乘 . 所以最终看起来像这样:您希望将
Lst
传递给递归调用,以便它们也可以查找变量 . 从这里你应该能够推断plus
和minus
案件的样子 . 你真的不应该需要看起来像plus(X)
的情况,因为它只有一个参数 .Prolog的神奇之处在于,这真的是你所要做的 . 只要你有简单的工作,递归就会处理你的复杂例子 . 试试吧 . :)
希望这可以帮助!