我做了这个猜测程序,如果用户输入10,那么程序应该打印(写,你已经猜到了数字)。
否则shoudl打印错误并读取另一个数字,它将不会退出,直到用户输入正确的数字(多么愚蠢的程序)。
到目前为止,这就是我所做的,但我不知道为什么这对我不起作用。
guess_num(10):- write("You have guessed right"), nl.
guess_num(X) :- X =\= 10, write("Wrong guess"), nl , read(X), guess_num(X).
答案 0 :(得分:1)
这对我有用。
?- guess.
guess :- read(X), check_answer(X).
check_answer(10):- write("You have guessed right"), nl.
check_answer(X) :- X =\= 10, write("Wrong guess"), nl, guess.
无需(强制)递归即可更好地工作:
guess:-
repeat,
read(X),
check_answer(X),
!.
check_answer(10) :- write("You have guessed right"), nl.
check_answer(X) :- X =\= 10, write("Wrong guess"), nl, fail.
答案 1 :(得分:1)
使用@Enigmativity在他的回答中显示的机制repeat
可能是更好的方法来实现它,而不是递归。但是,除了特定问题(以及一个建议)之外,您的递归方法基本上可以正常工作:
您正试图在第二个子句中重新实例化一个变量,而Prolog不允许这样做。因此,如果用户查询guess_num(9).
您read(X)
X = 9
,9
将失败,除非用户再次输入!
。您需要使用新变量。
在这种方法中使用剪切(guess_num(10) :-
!,
write("You have guessed right"), nl.
guess_num(X) :-
X =\= 10,
write("Wrong guess"), nl,
read(X1),
guess_num(X1).
)将消除用户猜对时将出现的选择点。没有剪切,一旦用户被告知他们有正确的答案,Prolog将提示用户提供更多解决方案。
进行上述更正将为您提供:
?- guess_num(9).
Wrong guess
|: 8.
Wrong guess
|: 10.
You have guessed right
true.
?-
使用上面的代码:
?- guess_num(9).
Wrong guess
|: 8.
Wrong guess
|: 10.
You have guessed right
true ;
false.
?-
没有削减:
{{1}}