2012-05-26 4 views
0

사용자가 게임을 찾기 위해 질문에 답하는 프로그램을 만들려고하지만 목록을 다루고 어설 션하는 방법을 이해할 수 없습니다. 나는 procedure pointsystem으로 다른 방법을 시도했다. 이 프로그램은 다음과 같이이다 :프롤로그를 가진 사용자를위한 올바른 게임을 맞춰보십시오.

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.

이 방법이 잘못된 이유를 이해할 수 없습니다. 가장 큰 점수를 가진 게임을 찾고 인쇄 할 수 있도록 어떻게 단언 또는 목록으로이 작업을 수행 할 수 있습니까?

답변

0

철회를 사용하는 올바른 방법은 아닙니다.

그런 시도 :

retractall(yes(_)) 

이 모든 대답을 철회 할

관련 문제