我在这个问题上为你提供了帮助:
我正在编写一个Prolog程序,当程序运行时关闭SWI-prolog窗口时,它进入意外循环然后挂起并关闭!!
我不知道为什么会这样?
我的代码是:
start:-
write('Select one of the options: '),nl,
write('1- Sum two numbers'),nl,
write('2- EXIT'),nl,
getChoice(X),choice(X).
%Validate choice
getChoice(N):- repeat, read(N), validate(N), !.
validate(N):- integer(N), N > 0, N =< 2, ! .
validate(N):- write(N),
write(' is an invaild menue choice, enter a valid choice: '),
!, fail.
choice(X):- X is 1, write(' This option for summing two numbers'), start.
choice(X):- X is 2, halt.
提前谢谢。
答案 0 :(得分:2)
你拥有的是一个所谓的故障驱动循环。正如您目前所遇到的那样,这种循环非常容易出错。只需查看:
getChoice(N):- repeat, read(N), validate(N), !.
那么如果validate/1
失败会发生什么?好吧,系统将再次尝试执行read(N)
。如果您完成了,N
将与end_of_file
统一,这将使validate(end_of_file)
失败。所以,虽然我们已经结束了,但我们将阅读过去的end_of_file。根据您的系统,这可能会产生另一个end_of_file
等。
简而言之,这些事情非常难以理解。尽可能避免故障驱动的循环。更好的是,作为初学者,避免手动进行I / O.相反,试着坚持语言的纯粹部分,让顶层循环为你做印刷。
在你的情况下,而不是写:
getChoice(M) :-
read(N),
( N = end_of_file -> fail
; validate(N) -> M = N
; getChoice(M)
).
但你不能从这些丑陋的代码中学到很多东西。坚持纯粹的一面。