Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们如何在prolog中表示复杂整数的加法和乘法?_Prolog - Fatal编程技术网

我们如何在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

我对Prolog语言还不熟悉,试图自学。我遇到了一个有趣的问题,上面说:

将复整数表示为两个整数元素列表,因此
[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>-
表示“未知”。非常感谢,乘法遵循相同的过程吗?当然,不同的公式,但在其他方面类似。对复数使用相同的表示形式。