" Кальвин , вы уверены, что это для настоящего класса физики?"
Но, возможно, это поможет:
Профессор Вирт привил мне пожизненную ненависть отладчиков, и мне нравятся распечатки:
outspeeds_s(chicken_soup, clams, Sd, Sd) :- format("Fact: outspeeds(~w, ~w)\n",[chicken_soup,clams]).
outspeeds_s(beef, clams, Sd, Sd) :- format("Fact: outspeeds(~w, ~w)\n",[beef,clams]).
outspeeds_s(chicken_soup, beef, Sd, Sd) :- format("Fact: outspeeds(~w, ~w)\n",[chicken_soup,beef]).
outspeeds_s(chicken_soup, tomatoes, Sd, Sd) :- format("Fact: outspeeds(~w, ~w)\n",[chicken_soup,tomatoes]).
outspeeds_s(clams, tomatoes, Sd, Sd) :- format("Fact: outspeeds(~w, ~w)\n",[clams,tomatoes]).
outspeeds_s(A, B, Sd_in, Sd_max) :-
format("Stack ~w: The question is outspeeds(~w, ~w)?\n",[Sd_in,A,B]),
format("Stack ~w: ~w is fresh variable, we will now try outspeeds(~w, ~w)?\n",[Sd_in,X,A,X]),
Sd_next is Sd_in+1,
% can't ask the user in SWISH, so we sleep 3 seconds instead
sleep(3),
outspeeds_s(A, X, Sd_next, Sd_max_1),
format("Stack ~w: We found that outspeeds(~w, ~w)!\n",[Sd_in,A,X]),
format("Stack ~w: But does outspeeds(~w, ~w)?\n",[Sd_in,X,B]),
% can't ask the user in SWISH, so we sleep 3 seconds instead
sleep(3),
outspeeds_s(X, B, Sd_next, Sd_max_2),
Sd_max is max(Sd_max_1, Sd_max_2),
format("Stack ~w: We also found that outspeeds(~w, ~w)!\n",[Sd_in,X,B]),
format("Stack ~w: So we can conclude that outspeeds(~w, ~w)!\n",[Sd_in,A,B]).
outspeeds(X,Y) :-
format("outspeeds(~w, ~w)?\n",[X,Y]),
outspeeds_s(X,Y,0,Ss_max),
format("Found that outspeeds(~w, ~w) with max stack depth ~w\n",[X,Y,Ss_max]).
Вы можете различить guish бесконечную рекурсию, запрашивающую outspeeds(tomatoes,_)
Попробуйте в SWI SH.
(К сожалению, SWI SH, к сожалению, не принимает ввод пользователя через get/1
, его необходимо добавить.)
Для фактического решения проблемы вам доступны несколько вариантов, чтобы потенциальный трипмин outspeeds(A, B) :- outspeeds(A, X), outspeeds(X, B).
безвреден. Прочитайте этот недавний вопрос для идеи или двух:
Рекурсивный l oop необходим оператор выхода