序言未捕获的异常:error(existence_error(procedure,a / 0),top_level / 0)

时间:2019-04-29 21:09:12

标签: prolog

我正在Prolog中开发一个程序,就像一个快餐店的培训视频。我的代码可以编译,但是无论我回答什么,一旦进入第二种状态,我都会看到一条错误消息

  

“未捕获的异常:错误(existence_error(procedure,a / 0),top_level / 0)”

%Taylor Loslo
%Program 15
%Krusty Krab Training PRogram

start_state(uniformshirt).

next_state(uniformshirt,a,uniformshoes).
next_state(uniformshirt,b,uniformshoes).
next_state(uniformshoes,a,makekrabbypattystart).
next_state(uniformshoes,b,makekrabbypattystart).
next_state(uniformshoes,c,makekrabbypattystart).
next_state(uniformshoes,d,makekrabbypattystart).
next_state(makekrabbypattystart,a,cookedpattysv).
next_state(makekrabbypattystart,b,veggiesadded).
next_state(makekrabbypattystart,c,sauceadded).
next_state(makekrabbypattystart,d,makekrabbypattystart).
next_state(cookedpattysv,a,pattyveggies).
next_state(cookedpattysv,b,pattysauce).
next_state(veggiesadded,a,pattyveggies).
next_state(veggiesadded,b,veggiesauce).
next_state(sauceadded,a,pattysauce).
next_state(sauceadded,b,veggiesauce).
next_state(pattysauce,s,pattyfinished).
next_state(pattysauce,b,pattyfinished).
next_state(veggiesauce,s,pattyfinished).
next_state(veggiesauce,b,pattyfinished).
next_state(pattyveggies,s,pattyfinished).
next_state(pattyveggies,b,pattyfinished).
next_state(pattyfinished,s,pattyserved).

display_intro :-
    write('WELCOME TO THE KRUSTY KRAB TRAINING PROGRAM'),nl,
    write('Congratulations on your new job as FRY COOK '),nl,nl,
    write('Lets get started!'),nl.


initialize :-
    asserta(stored_answer(money,0)),
    asserta(stored_answer(toes,10)),
    asserta(stored_answer(handswashed,no)),
    asserta(stored_answer(patty,no)),
    asserta(stored_answer(veggies,no)),
    asserta(stored_answer(secretsauce,no)).

goodbye :-
    write('Training Results:'),nl,
    write('Money: $'),stored_answer(money,_),nl,
    write('Toes: '),stored_answer(toes,_),nl,nl.

show_state(uniformshirt) :-
    write('You are deciding what to wear for your first day of work.'),nl,
    write('Do you...'),nl,
    write('(a) Wear your clean Krusty Krab polo shirt'),nl,
    write('(b) Wear your favorite t-shirt that youve been wearing for 3 days straight'),nl,
    write('(q) Quit'),nl,nl.

show_state(uniformshoes) :-
    write('Before heading to work you have to put on shoes'),nl,
    write('Do you pick...'),nl,
    write('(a) Comfortable skater shoes'),nl,
    write('(b) Non-slip sneakers'),nl,
    write('(c) Flip flops'),nl,
    write('(q) Quit'),nl,nl.

show_state(makekrabbypattystart) :-
    write('Now that you are properly dressed lets make a Krabby Patty'),nl,nl,
    write('Do you want to...'),nl,
    write('(a) Start cooking the patty'),nl,
    write('(b) Chop the veggies'),nl,
    write('(c) Add secret sauce'),nl,
    write('(d) Wash your hands'),nl,
    write('(q) Quit'),nl,nl.

show_state(cookedpattysv) :-
    write('Next do you want to...'),nl,
    write('(a) Chop the veggies'),nl,
    write('(b) Add secret sauce'),nl,
    write('(q) Quit'),nl,nl.


show_state(pattysauce) :-
    write('Next do you want to...'),nl,
    write('(s) Serve it to the customer'),nl,
    write('(b) Chop the Veggies'),nl,
    write('(q) Quit'),nl,nl.

show_state(pattyveggies) :-
    write('Next do you want to...'),nl,
    write('(s) Serve it to the customer'),nl,
    write('(b) Add the secret sauce'),nl,
    write('(q) Quit'),nl,nl.

show_state(veggiesadded) :-
    write('Next do you want to...'),nl,
    write('(a) Cook the patty'),nl,
    write('(b) Add secret sauce'),nl,
    write('(q) Quit'),nl,nl.

show_state(veggiesauce) :-
    write('(s) Serve it to the customer'),nl,
    write('(b) Cook the patty'),nl,
    write('(q) Quit'),nl,nl.

show_state(sauceadded) :-
    write('Next do you want to...'),nl,
    write('(a) Cook the patty'),nl,
    write('(b) Chop the veggies'),nl,
    write('(q) Quit'),nl,nl.

show_state(pattyfinished) :-
    write('Next do you want to...'),nl,
    write('(s) Serve it to the customer'),nl,
    write('(q) Quit'),nl,nl.

show_state(pattyserved) :-
    stored_answer(patty,yes),
    stored_answer(veggies,yes),
    stored_answer(secretsauce,no),
    write('You forgot to add the secretsauce!'),nl,
    write('The customer complains its dry and you have to make another'),nl,nl,
    show_state(washedhands),
    goodbye.

show_state(pattyserved) :-
    stored_answer(patty,yes),
    stored_answer(veggies,yes),
    stored_answer(secretsauce,yes),
    write('You served a perfect Krabby Patty!'),nl,nl,
    show_state(washedhands),
    goodbye.

show_state(pattyserved) :-
    stored_answer(patty,no),
    stored_answer(veggies,yes),
    stored_answer(secretsauce,yes),
    write('You forgot to add the patty!'),nl,
    write('The customer complains and you have to make another'),nl,nl,
    show_state(washedhands),
    goodbye.

show_state(pattyserved) :-
    stored_answer(patty,yes),
    stored_answer(veggies,no),
    stored_answer(secretsauce,yes),
    write('You forgot to add the veggies!'),nl,
    write('The customer does no complain because he always picks those off anyways'),nl,nl,
    show_state(washedhands),
    goodbye.

show_state(washedhands) :-
    stored_answer(handswashed,yes),
    write('Thank you for remembering to wash your hands before you started'),nl,nl.

show_state(washedhands) :-
    stored_answer(handswashed,no),
    write('You did not wash your hands before cooking the patty'),nl,
    write('The customer gets sick and sues you.'),nl,nl,
    stored_answer(money,Amount),
    retract(stored_answer(money,_)),
    Newamount is Amount - 10000,
    asserta(stored_answer(money,Newamount)).

show_transition(uniformshirt,b) :-
    write('Mr Krabs notices how filthy your shirt is and sends you home to put on a clean one'),nl,
    write('You lost $5 in wages from missing work'),nl,nl,
    stored_answer(money,Amount),
    retract(stored_answer(money,_)),
    Newamount is Amount - 5,
    asserta(stored_answer(money,Newamount)).

show_transition(uniformshirt,a) :-
    write('Looking good!'),nl,nl.

show_transition(uniformshoes,a) :-
    write('You come into work and immediately slip on grease.'),nl,
    write('You crack your skull open and have to miss work for 6 weeks'),nl,
    write('Mr Krabs refuses to pay you workmans compensation'),nl,
    write('Next time you come into work you wear non-slip shoes...'),nl,nl.

show_transition(uniformshoes,c) :-
    write('OUCH!'),nl,
    write('You lose your big toe when you drop a knife while you are cutting onions'),nl,
    write('You come into work the next day with crutches and non-slip shoes...'),nl,nl,
    stored_answer(toes,_),
    retract(stored_answer(toes,_)),
    asserta(stored_answer(toes,9)).

show_transition(uniformshoes,b) :-
    write('Perfect! Those are the most practical shoes for the job'),nl,nl.

show_transition(sauceadded,a) :-
    retract(stored_answer(patty,no)),
    asserta(stored_answer(patty,yes)),
    write('You cook the patty to perfection.'),nl,nl.

show_transition(sauceadded,b) :-
    retract(stored_answer(veggies,no)),
    asserta(stored_answer(veggies,yes)),
    write('You chopped the onions, lettuce, and tomato. '),nl,
    write('You added the veggies to the burger. '),nl,nl.

show_transition(makekrabbypattystart,a) :-
    retract(stored_answer(patty,no)),
    asserta(stored_answer(patty,yes)),
    write('You cook the patty to perfection.'),nl,nl.

show_transition(makekrabbypattystart,d) :-
    retract(stored_answer(handswashed,no)),
    asserta(stored_answer(handswashed,yes)),
    write('You washed your hands.'),nl,nl.

show_transition(pattysauce,b) :-
    retract(stored_answer(veggies,no)),
    asserta(stored_answer(veggies,yes)),
    write('You chopped the onions, lettuce, and tomato. '),nl,
    write('You added the veggies to the burger. '),nl,nl.

show_transition(veggiesauce,b) :-
    retract(stored_answer(patty,no)),
    asserta(stored_answer(patty,yes)),
    write('You cook the patty to perfection.'),nl,nl.

show_transition(makekrabbypattystart,c) :-
    retract(stored_answer(secretsauce,no)),
    asserta(stored_answer(secretsauce,yes)),
    write('You added the secret sauce to the burger. '),nl,nl.

show_transition(veggiesadded,b) :-
    retract(stored_answer(secretsauce,no)),
    asserta(stored_answer(secretsauce,yes)),
    write('You added the secret sauce to the burger. '),nl,nl.

show_transition(veggiesadded,a) :-
    retract(stored_answer(patty,no)),
    asserta(stored_answer(patty,yes)),
    write('You cook the patty to perfection.'),nl,nl.

show_transition(pattyveggies,b) :-
    retract(stored_answer(secretsauce,no)),
    asserta(stored_answer(secretsauce,yes)),
    write('You added the secret sauce to the burger. '),nl,nl.

show_transition(makekrabbypattystart,b) :-
    retract(stored_answer(veggies,no)),
    asserta(stored_answer(veggies,yes)),
    write('You chopped the onions, lettuce, and tomato. '),nl,
    write('You added the veggies to the burger. '),nl,nl.

show_transition(cookpattysv,b) :-
    retract(stored_answer(secretsauce,no)),
    asserta(stored_answer(secretsauce,yes)),
    write('You added the secret sauce to the burger. '),nl,nl.

show_transition(cookpattysv,a) :-
    retract(stored_answer(veggies,no)),
    asserta(stored_answer(veggies,yes)),
    write('You chopped the onions, lettuce, and tomato. '),nl,
    write('You added the veggies to the burger. '),nl,nl.

show_transition(_,s) :-
    show_state(pattyserved).


go :-
    intro,
    start_state(X),
    show_state(X),
    get_choice(X,Y),
    go_to_next_state(X,Y).

intro :-
    display_intro,
    clear_stored_answers,
    initialize.

go_to_next_state(_,q) :-
    goodbye,!.

go_to_next_state(S1,Cin) :-
    next_state(S1,Cin,S2),
    show_transition(S1,Cin),
    show_state(S2),
    stored_answer(moves,K),
    OneMoreMove is K + 1,
    retract(stored_answer(moves,_)),
    asserta(stored_answer(moves,OneMoreMove)),
    get_choice(S2,Cnew),
    go_to_next_state(S2,Cnew).

go_to_next_state(S1,Cin) :-
    \+ next_state(S1,Cin,_),
    show_transition(S1,fail),
    get_choice(S1,Cnew),
    go_to_next_state(S1,Cnew).

get_choice(_,C) :-
    write('Next entry (letter followed by a period)? '),
    read(C).

% case knowledge base - user responses

:- dynamic(stored_answer/2).

% procedure to get rid of previous responses
% without abolishing the dynamic declaration

clear_stored_answers :- retract(stored_answer(_,_)),fail.
clear_stored_answers.

我完全被卡住了,如何丢失此错误并继续执行程序的其余部分?

1 个答案:

答案 0 :(得分:0)

我添加了许多trace/1调用来弄清楚您的问题是什么,但是您可以通过执行trace(stored_answer/2)来找到它,因为您会看到以下内容:

Before heading to work you have to put on shoes
Do you pick...
(a) Comfortable skater shoes
(b) Non-slip sneakers
(c) Flip flops
(q) Quit

 T Exit: (10) show_state(uniformshoes)
 T Call: (10) stored_answer(moves, _5580)
 T Fail: (10) stored_answer(moves, _5580)
 T Redo: (10) show_transition(uniformshirt, a)
 T Fail: (10) show_transition(uniformshirt, a)
 T Redo: (9) go_to_next_state(uniformshirt, a)
 T Call: (10) next_state(uniformshirt, a, _5582)
 T Exit: (10) next_state(uniformshirt, a, uniformshoes)
 T Fail: (9) go_to_next_state(uniformshirt, a)
false.

这表明stored_answer(moves, K)在循环的第一次迭代中失败,因为尚未初始化。因此,解决方案就是在您的initialize谓词上添加一行初始化该变量的行:

initialize :-
    asserta(stored_answer(money,0)),
    asserta(stored_answer(toes,10)),
    asserta(stored_answer(handswashed,no)),
    asserta(stored_answer(patty,no)),
    asserta(stored_answer(veggies,no)),
    asserta(stored_answer(secretsauce,no)),
    asserta(stored_answer(moves,0)).  %% <-- new

更改之后,该程序似乎可以按预期运行。

相关问题