我们如何在prolog中表示复杂整数的加法和乘法?
我对Prolog语言还不熟悉,试图自学。我遇到了一个有趣的问题,上面说: 将复整数表示为两个整数元素列表,因此我们如何在prolog中表示复杂整数的加法和乘法?,prolog,Prolog,我对Prolog语言还不熟悉,试图自学。我遇到了一个有趣的问题,上面说: 将复整数表示为两个整数元素列表,因此[2,5]表示2+5i。 编写Prolog谓词 cadd/3 cmult/3 表示复杂整数的加法和乘法。所以比如说, cadd([X1,X2],[Y1,Y2],[Z1,Z2]) 当且仅当Z1=X1+Y1和Z2=X2+Y2时成功 请注意,复数乘法与复数加法不同 我是新来的。如果有人能帮忙,我正在努力自学。非常感谢您的帮助 注意:这只是为了学习正如作业中所说 :-使用_模块(库(c
[2,5]
表示2+5i。编写Prolog谓词
cadd/3
cmult/3
表示复杂整数的加法和乘法。所以比如说,
cadd([X1,X2],[Y1,Y2],[Z1,Z2])
当且仅当Z1=X1+Y1
和Z2=X2+Y2
时成功请注意,复数乘法与复数加法不同 我是新来的。如果有人能帮忙,我正在努力自学。非常感谢您的帮助
注意:这只是为了学习正如作业中所说
:-使用_模块(库(clpfd))。%在SWI序言中
cadd([X1,X2],[Y1,Y2],[Z1,Z2]):-
%%当且仅当Z1=X1+Y1和Z2=X2+Y2时成功。
Z1#=X1+Y1,
Z2#=X2+Y2。
Prolog中的
#=
是算术等式约束<代码>=是象征性的统一is
是算术赋值/等式检查,但当is
右侧的所有变量都已知时,必须使用它#=
自动处理此问题。展开我对复数表示的评论。考虑:
| ?- write_canonical([2,3]).
'.'(2,'.'(3,[]))
yes
| ?- write_canonical(c(2,3)).
c(2,3)
yes
| ?- arg(2, [2,3], Arg).
Arg = [3]
yes
| ?- arg(2, c(2,3), Arg).
Arg = 3
yes
替代表示也可以可视化为:
c .
/ \ / \
2 3 2 .
/ \
3 []
重用将解决以下问题:
:- use_module( library( clpfd)). % in SWI Prolog
cadd(c(X1,X2), c(Y1,Y2), c(Z1,Z2)) :-
%% succeeds if and only if Z1=X1+Y1 and Z2=X2+Y2.
Z1 #= X1 + Y1,
Z2 #= X2 + Y2.
如果Prolog系统不支持约束:
cadd(c(X1,X2), c(Y1,Y2), c(Z1,Z2)) :-
%% succeeds if and only if Z1=X1+Y1 and Z2=X2+Y2.
Z1 is X1 + Y1,
Z2 is X2 + Y2.
电话示例:
| ?- [user].
compiling user for byte code...
cadd(c(X1,X2), c(Y1,Y2), c(Z1,Z2)) :-
%% succeeds if and only if Z1=X1+Y1 and Z2=X2+Y2.
Z1 is X1 + Y1,
Z2 is X2 + Y2.
user compiled, 4 lines read - 679 bytes written, 1921 ms
| ?- cadd(c(2,3), c(-2,1), C).
C = c(0,4)
yes
提示:在Prolog中使用数学表达式时,不要使用统一的
=
,例如X是2+3。
。SWI中有一个包,也许你可以看看:唯一简单的答案是,把它写下来,但在Z1=X1+Y1
和Z2=X2+Y2
中使用=/code>而不是=/code>。“and”在Prolog中是,
。使用列表表示复数效率低下。更喜欢使用诸如c(R,I)
之类的术语。在两种表示法上使用write_canonical/1
,以了解差异。@PauloMoura您能否将其添加到更容易理解的答案中;)这是一个错误,它不起作用…?-cadd([2,3],-2,1],[0,4])。错误:未定义的过程:cadd/3(DWIM无法更正目标)感谢您的反馈,我已编辑,和。感谢您的回答,但它不起作用。它显示相同的错误,也不允许使用库。是否有更简单的方法?在我提供的链接中,它确实起作用。您可以尝试使用=
而不是#=
(并且不使用use\u module
指令行),但它只能在一个方向工作:cadd(+A,+B,-C)
+
表示“已知”,“code>-
表示“未知”。非常感谢,乘法遵循相同的过程吗?当然,不同的公式,但在其他方面类似。对复数使用相同的表示形式。