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实现将跳过顶层提示以获取其他解决方案。