如何解决使用序言
给定一个签名(0,Z,{plus(2),minus(2),times(2)}
,常数是整数,函数是正负号和时间,每个arity 2
。我想写两个谓词arth/2
和printarth/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/2
和eval_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 举报,一经查实,本站将立刻删除。