我在Prolog程序中意外循环

时间:2014-04-20 15:20:06

标签: prolog

我在这个问题上为你提供了帮助:

我正在编写一个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.

提前谢谢。

1 个答案:

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

但你不能从这些丑陋的代码中学到很多东西。坚持纯粹的一面。