任何人都知道为什么会一直失败?
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)
答案 0 :(得分:4)
我认为如果你没有把所有东西写成一个条款会更好。这不仅会使你的代码更具可读性,而且你也不会犯这个错误。
问题是您的代码解析如下:
(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 :(得分: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