当我加上两个数时,它给我的和在Prolog中是_G4080-_G4081

当我加上两个数时,它给我的和在Prolog中是_G4080-_G4081,prolog,Prolog,我在下面的代码中对两个数字求和,但结果并不是我所期望的,真的。我不确定我做错了什么 me(a). run:- write('Enter the first number: '), read(X), write('Enter the second Number: '), read(Y),nl, write('What would you like to do?'),nl, write('\na.Add.\n'), write('b.Subtract.\n

我在下面的代码中对两个数字求和,但结果并不是我所期望的,真的。我不确定我做错了什么

me(a).

run:-
   write('Enter the first number: '),
   read(X),
   write('Enter the second Number: '),
   read(Y),nl,
   write('What would you like to do?'),nl,
   write('\na.Add.\n'),
   write('b.Subtract.\n'),
   write('c.Multiply.\n'),
   write('d.Divided.\n'),
   write('e.Exit'),nl,nl,
   write('Answer a, b, c, d or e:  '),
   read(C),
   check(C).

check(C):-me(C),S=X+Y,write('Sum is '),write(S),nl.
check(_):-me(C),write('Name not none'),nl.
结果给出:它也给出了单音变量错误

14?-快跑。 输入第一个数字:2。 输入第二个数字:3

   What would you like to do?

   a.Add.
   b.Subtract.
   c.Multiply.
   d.Divided.
   e.Exit

   Answer a, b, c, d or e:  a.
   Sum is _G5053+_G5054
   true 

我能做什么

Prolog中的变量不是通用的。这意味着当此规则结束时,您在规则
run
中的变量
X
Y
的值将被“删除”

那以后呢

read(C),
   check(C).
变量中将不再有任何值

如果你尝试像

me(a).

   run:-write('Enter the first number: '),
   read(X),nl,
   write('Enter the second Number: '),
   read(Y),nl,
   write('What would you like to do?'),nl,
   write('\na.Add.\n'), 
   write('b.Subtract.\n'),
   write('c.Multiply.\n'),
   write('d.Divided.\n'),
   write('e.Exit'),nl,nl,
   write('Answer a, b, c, d or e:  '),
   read(C),
  me(C),S is X + Y, write('Sum is '),write(S),nl.
结果将是:

7 ?- run.
Enter the first number: 1.

Enter the second Number: 3.

What would you like to do?

a.Add.
b.Subtract.
c.Multiply.
d.Divided.
e.Exit

Answer a, b, c, d or e:  a.
Sum is 4
true.

就像你想要的

所以你必须找到一种方法在一条规则中完成所有的计算

另外,请记住,Prolog中的
=
与其他语言不同。在Prolog中,
=
用于检查两个“事物”是否相同。这意味着此查询:

3 = 3.
将返回
true。
,查询
3=4。
将返回
false。

因此,由于您的查询是
S=X+Y.
,Prolog尝试进行检查

如果S的值等于X和Y的值之和

结果是真是假

在Prolog中建立算术方程的方法是使用
is

结果给出:它也给出了单音变量错误


这不是错误,而是警告。单音变量是声明但从未使用过的变量。当您有这些警告时,您的程序可以正常运行,但是如果您想消除它们,您可以用下划线(

替换它们。您必须使用
(is)/2
来获得算术求值,而不是
(=)/2
(统一)。例如:
S是X+Y
我也用过这个,但同样的情况也发生了,谢谢你的评论。你确定在修改程序后重新加载了它吗?同样的事情不太可能发生现在它应该告诉你,
is
参数没有得到足够的实例化这是正确的想法,但更准确地说,你可以说,在给定谓词子句的头部或主体中引入的变量在该子句的范围内是有限的。在OP谓词的情况下,谓词
run
中引入的变量
X
Y
在调用
check
时仍然存在,在返回时仍然存在,但在调用
check
时变为超出范围,在
check
中引入的
X
Y
X
Y
不同。
3 = 3.