首页 文章

Prolog - 评估代数表达式[重复]

提问于
浏览
0

这个问题在这里已有答案:

这是我遇到问题的测试复习问题 . 你如何编写一个方法来用运算符'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 回答

  • 2

    我怀疑你是否允许自己因复杂的例子而下雪 . 你只是缺少一个基本案例,所有归纳案例都非常简单 . 你只需要一些简单的例子 . 对于初学者来说,这会带来什么回报呢?

    ?- simplify(3, Val, []).
    

    是的, Val = 3 . 所以让我们补充一下缺少基本情况:

    simplify(Num, Num, _) :- number(Num).
    

    对归纳案例的关键见解是 plusminustimes 都具有相同的递归二进制结构 . 您可以递归地将 simplify 应用于双方以实现评估 . 让我们尝试另一个简单的例子:

    ?- simplify(times(3, 3), Val, []).
    

    我们想要 Val = 9 . 我们需要做的就是弄清楚左边和右边的值是什么,并将它们相乘 . 所以最终看起来像这样:

    simplify(times(Left, Right), Value, Lst) :-
      simplify(Left, LeftVal, Lst),
      simplify(Right, RightVal, Lst),
      Value is LeftVal * RightVal.
    

    您希望将 Lst 传递给递归调用,以便它们也可以查找变量 . 从这里你应该能够推断 plusminus 案件的样子 . 你真的不应该需要看起来像 plus(X) 的情况,因为它只有一个参数 .

    Prolog的神奇之处在于,这真的是你所要做的 . 只要你有简单的工作,递归就会处理你的复杂例子 . 试试吧 . :)

    希望这可以帮助!

相关问题