Io 与'有关的问题;大于';
有人知道为什么这个一直失败吗Io 与'有关的问题;大于';,io,prolog,Io,Prolog,有人知道为什么这个一直失败吗 foo :- write('3 numbers: '), read(A), read(B), read(C), (A > B,B > C,write(A),tab(1),write(B),tab(1),write(C)); (A > C,C > B,write(A),tab(1),write(C),tab(1),write(B)); (B > A,A > C,write(
foo :- write('3 numbers: '),
read(A),
read(B),
read(C),
(A > B,B > C,write(A),tab(1),write(B),tab(1),write(C));
(A > C,C > B,write(A),tab(1),write(C),tab(1),write(B));
(B > A,A > C,write(B),tab(1),write(A),tab(1),write(C));
(B > C,C > A,write(B),tab(1),write(C),tab(1),write(A));
(C > B,B > A,write(C),tab(1),write(B),tab(1),write(A));
(C > A,A > B,write(C),tab(1),write(B),tab(1),write(A)).
是一个prolog函数,用于按顺序打印3个输入数字。
我不断地发现这个错误:
uncaught exception: error(instantiation_error,(>)/2)
我想你最好不要把所有的东西都写在一个条款里。这不仅会使您的代码更具可读性,而且您也不会犯这个错误 问题在于,您的代码被解析为如下内容:
(read AND read AND read AND test) OR test OR test OR …
这意味着A
、B
和C
仅在第一次测试中有值。而
要求两个参数都有一个值。要解决此问题,可以使用括号:
foo :- write('3 numbers: '),
read(A),
read(B),
read(C),
((A > B,B > C,write(A),tab(1),write(B),tab(1),write(C));
(A > C,C > B,write(A),tab(1),write(C),tab(1),write(B));
(B > A,A > C,write(B),tab(1),write(A),tab(1),write(C));
(B > C,C > A,write(B),tab(1),write(C),tab(1),write(A));
(C > B,B > A,write(C),tab(1),write(B),tab(1),write(A));
(C > A,A > B,write(C),tab(1),write(B),tab(1),write(A))).
我想你最好不要把所有的东西都写在一个条款里。这不仅会使您的代码更具可读性,而且您也不会犯这个错误 问题在于,您的代码被解析为如下内容:
(read AND read AND read AND test) OR test OR test OR …
这意味着A
、B
和C
仅在第一次测试中有值。而
要求两个参数都有一个值。要解决此问题,可以使用括号:
foo :- write('3 numbers: '),
read(A),
read(B),
read(C),
((A > B,B > C,write(A),tab(1),write(B),tab(1),write(C));
(A > C,C > B,write(A),tab(1),write(C),tab(1),write(B));
(B > A,A > C,write(B),tab(1),write(A),tab(1),write(C));
(B > C,C > A,write(B),tab(1),write(C),tab(1),write(A));
(C > B,B > A,write(C),tab(1),write(B),tab(1),write(A));
(C > A,A > B,write(C),tab(1),write(B),tab(1),write(A))).
使用true if-then-else:
(A > B, B > C ->
write(A),tab(1),write(B),tab(1),write(C)
; A > C, C > B ->
write(A),tab(1),write(C),tab(1),write(B)
; B > A, A > C ->
write(B),tab(1),write(A),tab(1),write(C)
; % etc
使用true if-then-else:
(A > B, B > C ->
write(A),tab(1),write(B),tab(1),write(C)
; A > C, C > B ->
write(A),tab(1),write(C),tab(1),write(B)
; B > A, A > C ->
write(B),tab(1),write(A),tab(1),write(C)
; % etc
美好的非常感谢。问题解决了。还有一个疑问,在它给出答案后,它一直问我“是真的吗?”。。为什么?@julio阿尔及利亚:我怀疑您看到的提示反映了foo/0可能在多个“解决方案”中成功。您可以通过添加一个切口来防止这种可能性!在你的统治结束时。如果目标不包含自由变量(如此处所示),一些Prolog实现将跳过顶层提示以获得其他解决方案。很好!非常感谢。问题解决了。还有一个疑问,在它给出答案后,它一直问我“是真的吗?”。。为什么?@julio阿尔及利亚:我怀疑您看到的提示反映了foo/0可能在多个“解决方案”中成功。您可以通过添加一个切口来防止这种可能性!在你的统治结束时。如果目标不包含自由变量(如此处所示),则某些Prolog实现将跳过顶层提示以获取其他解决方案。