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的神奇之处在于,这是你真正需要做的一切。递归将在简单示例运行后立即处理复杂示例。试试看。:)
希望这有帮助 当然,似乎类似于;)