微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用序言

如何解决使用序言

给定一个签名(0,Z,{plus(2),minus(2),times(2)},常数是整数,函数是正负号和时间,每个arity 2。我想写两个谓词arth/2printarth/1,它们采用上述签名中的术语,并进行必要的算术计算加法,减法和乘法。arth/2将打印结果,{{1 }}应该得出评估表达式,如下所示。

我想实现两件事

第一:

printarth/1

秒:

?- arth( plus(minus(8,2),times(4,-3)),N).
N = -6

N is evaluated as ((8−2) + (4∗−3)) = (6 +−12) =−6

我知道为此使用了?- printarth(plus(minus(8,N). ((8 - 2) + (4 * -3)) true. ,并从下面开始了我的代码

Terms,Ops and complex terms

从这里开始,我很难创建arithmetic_operator('+'). arithmetic_operator('-'). arithmetic_operator('*'). arithmetic_expression(N) :- integer(N). arithmetic_expression(Term) :- Term =..[Functor,Component1,Component2],arithmetic_operator(Functor),arithmetic_expression(Component1),arithmetic_expression(Component2). arth/2,因为我无法调用printarth/1并在调用时抛出错误

arithmetic_expression(Term)

有关此任务的任何资源都非常有用。

解决方法

如果您想使用一个看起来像这样的术语:

minus(2,3)

并将其转换为与-(2,3)等效的算术表达式2 - 3(使用-的默认定义作为运算符),然后对其求值,您可以像这样进行操作:

term_arithmetic_expression(T,E) :-
    T =.. [Name,X,Y],binary_op(Name,Op),E =.. [Op,Y].

eval_arithmetic_expression(T,R) :-
    term_arithmetic_expression(T,E),R is E.

binary_op(minus,-).
% add more binary operations

现在这至少有效:

?- eval_arithmetic_expression(minus(2,3),R).
R = -1.

如您所见,term_arithmetic_expression/2eval_arithmetic_expression/2都有两个参数。这就是将minus(2,4)映射到2 - 4所需要的。

您的arithmetic_expression/1已正确遍历,但未从一个表示映射到另一个。您的arithmetic_operator存在相同的问题。更改最少:

arithmetic_operator(plus,+).
arithmetic_operator(minus,-).
arithmetic_operator(times,*).

arithmetic_expression(N,N) :- integer(N).

arithmetic_expression(Term,Expr) :-
    Term =.. [Functor,Component1,Component2],arithmetic_operator(Functor,Operator),arithmetic_expression(Component1,Expr1),arithmetic_expression(Component2,Expr2),Expr =.. [Operator,Expr1,Expr2].

然后:

?- arithmetic_expression(plus(minus(8,2),times(4,-3)),Expr).
Expr = 8-2+4* -3 ;
false.

?- arithmetic_expression(plus(minus(8,Expr),Result is Expr.
Expr = 8-2+4* -3,Result = -6 ;
false.

?- arithmetic_expression(plus(minus(8,Result is Expr,display(Expr).
+(-(8,*(4,-3))
Expr = 8-2+4* -3,Result = -6 ;
false.

display是最后一个查询中输出的+(-(8,-3))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。