一个序言的递归难度

时间:2015-11-01 02:38:32

标签: prolog

我做了这个猜测程序,如果用户输入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).

2 个答案:

答案 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可能是更好的方法来实现它,而不是递归。但是,除了特定问题(以及一个建议)之外,您的递归方法基本上可以正常工作:

  1. 您正试图在第二个子句中重新实例化一个变量,而Prolog不允许这样做。因此,如果用户查询guess_num(9).read(X) X = 99将失败,除非用户再次输入!。您需要使用新变量。

  2. 在这种方法中使用剪切(guess_num(10) :- !, write("You have guessed right"), nl. guess_num(X) :- X =\= 10, write("Wrong guess"), nl, read(X1), guess_num(X1). )将消除用户猜对时将出现的选择点。没有剪切,一旦用户被告知他们有正确的答案,Prolog将提示用户提供更多解决方案。

  3. 进行上述更正将为您提供:

    ?- 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}}