2012-05-26 5 views
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.

Я не могу понять, почему этот путь неправильный. Как я могу сделать это с помощью assert или list, чтобы я мог найти игру с наибольшими точками и распечатать ее?

ответ

0

Это неправильный способ использования ретракта.

попробовать так:

retractall(yes(_)) 

это убирается все ответы

Смежные вопросы