'大于'的问题

时间:2011-10-08 14:51:08

标签: 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(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)

2 个答案:

答案 0 :(得分:4)

我认为如果你没有把所有东西写成一个条款会更好。这不仅会使你的代码更具可读性,而且你也不会犯这个错误。

问题是您的代码解析如下:

(read AND read AND read AND test) OR test OR test OR …

这意味着ABC仅在第一次测试中具有价值。并且>要求两个参数都有值。要解决此问题,您可以使用括号:

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))).

答案 1 :(得分:1)

使用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