0

ユーザーが質問に答えてゲームを見つけるプログラムを作成しようとしていますが、リストとアサートの操作方法がわかりませんでした。プロシージャポイントシステムで別の方法を試しました。プログラムは次のようになります。

yeah:-
   write('Please answer the questions to find the game which suite you!'),
   nl, 
   find(Game),
   nl,
   write('I guess that the game is  :'),
   nl,
   write(Game),
   undo.


find(assassinsCreedII ) :-
   assassinsCreedII(assassins).
find(sims3) :-
   sims3. 
find(undefined).

points(G) :-
 X=0, 
( (G == assassins) ->
(( X = X + 1),
print(X));
 Y=0, 
(G == sims3) -> 
(Y = Y + 1)).



assassinsCreedII(assassins) :-
   actionGame(assassins),
   adventureGame(assassins). 

sims3 :-
   simulationGame(sims).

actionGame(name) :-
   test(do_you_like_action_games,name ).
adventureGame(name) :-
   test(do_you_like_adventure_games,name).
simulationGame(N) :-
   test(do_you_like_simulation_games,N ).

requisition(Question,Name) :-
   write(Question),
   write('?'),
   read(Answer),
   nl,
   (   (Answer==yes ; Answer==y )
   ->
     assert(yes(Question))
   ;
     assert(no(Question)),
     fail
   ),
   points(Name).

:- dynamic yes/1,no/1.

test(Q,Name) :- 
   ( yes(Q) ->
     true;
     ( no(Q)
     -> fail
     ; requisition(Q,Name)
     )
   ).

undo :-
   retract(yes()),fail. 
undo :-
   retract(no()), fail. 
undo. 

プログラムを実行すると、結果は次のようになります。質問に答えて、あなたに合ったゲームを見つけてください!ゲームは : undefined true だと思います。

なぜこの方法が間違っているのか理解できません。最大のポイントを持つゲームを見つけて印刷できるように、アサートまたはリストでこれを行うにはどうすればよいですか?

4

1 に答える 1

0

これはリトラクトの正しい使い方ではありません。

そのようにしてみてください:

retractall(yes(_))

これにより、すべての回答が撤回されます

于 2012-08-26T09:49:01.317 に答える