Prolog-求值代数表达式

Prolog-求值代数表达式,prolog,Prolog,这是一个我遇到麻烦的考试复习问题。如何编写一个方法,用运算符“加”、“减”和“次”计算代数表达式。以下是一些测试查询: 简化(表达式、结果、列表) ?-简化(加(x,y)倍,减(x,y)倍),V[x:4,y:2])。V=14 ?-简化(乘以(2加(a,b)),Val[a:1,b:5])。Val=12 ?-简化(乘以(2加(a,b)),Val[a:1,b:-5])。Val=-8 我得到的只是这些示例查询,没有其他解释。但是我很确定这个方法应该分解第一个参数,它是代数表达式,用x和y替换第三个参数(

这是一个我遇到麻烦的考试复习问题。如何编写一个方法,用运算符“加”、“减”和“次”计算代数表达式。以下是一些测试查询:

简化(表达式、结果、列表)

?-简化(加(x,y)倍,减(x,y)倍),V[x:4,y:2])。V=14

?-简化(乘以(2加(a,b)),Val[a:1,b:5])。Val=12

?-简化(乘以(2加(a,b)),Val[a:1,b:-5])。Val=-8

我得到的只是这些示例查询,没有其他解释。但是我很确定这个方法应该分解第一个参数,它是代数表达式,用x和y替换第三个参数(列表)中的值。第二个参数应该是计算表达式后的结果

我认为其中一种方法应该是simplify(V,Val,L):-member(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) :-

我不确定第五种方法应该是什么。

我怀疑你让自己被复杂的例子蒙蔽了。你只是缺少一个基本情况,所有的归纳情况都很简单。你只需要一些简单的例子。首先,这会带来什么回报

?- simplify(3, Val, []).
是的,
Val=3
。因此,让我们添加缺少的基本情况:

simplify(Num, Num, _) :- number(Num).
归纳案例的关键洞察是,
都具有相同的递归二进制结构。您可以递归地将
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
传递给递归调用,以便它们也可以查找变量。从这里,您应该能够推断出
案例的外观。您真的不应该需要看起来像
plus(X)
的案例,因为它只有一个参数

Prolog的神奇之处在于,这是你真正需要做的一切。递归将在简单示例运行后立即处理复杂示例。试试看。:)

希望这有帮助

当然,似乎类似于;)