Я думаю, было бы лучше, если бы вы не написали все в одном предложении.Это не только сделает ваш код более читабельным, но вы также не совершите эту ошибку.
Проблема в том, что ваш код анализируется примерно так:
(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))).