Проблема с «больше чем» - PullRequest
0 голосов
/ 08 октября 2011

Кто-нибудь знает, почему это не работает?

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

Функция пролога для печати 3-х входных чисел по порядку. Я получаю эту ошибку:

uncaught exception: error(instantiation_error,(>)/2)

Ответы [ 2 ]

4 голосов
/ 08 октября 2011

Я думаю, было бы лучше, если бы вы не написали все в одном предложении.Это не только сделает ваш код более читабельным, но вы также не совершите эту ошибку.

Проблема в том, что ваш код анализируется примерно так:

(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))).
1 голос
/ 09 октября 2011

Используйте истинное 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
...