У меня есть задание для пролога, где я нахожусь на последнем этапе, но я просто не могу закончить sh это. У нас есть заданный планировщик, который в первую очередь является глубиной, и нам нужно изменить его, чтобы он был шире. Нам дан пример для поиска в ширину, поэтому мы можем реализовать это в коде:
% bfs(+initial_state, ?goal_state, ?solution)
bfs(X,Y,P) :-
bfs_b(Y,[n(X,[])],[],R),
reverse(R,P).
% bfs_b(?goal_state, +open_list, +closed_list, -reversed_solution)
bfs_b(Y,[n(Y,P)|_],_,P).
bfs_b(Y,[n(S,Pl1)|Ns],C,P) :-
findall(n(S1,[A|P1]),
(s(S,S1,A), \+ member(S1,C)),
Es),9
append(Ns,Es,O),
bfs_b(Y,O,[S|C],P).
s(a,b,go(a,b)).
s(b,a,go(b,a)).
s(a,c,go(a,c)).
s(c,a,go(c,a)).
s(b,d,go(b,d)).
s(d,b,go(d,b)).
s(b,e,go(b,e)).
s(e,b,go(e,b)).
s(c,e,go(c,e)).
s(e,c,go(e,c)).
s(d,f,go(d,f)).
s(f,d,go(f,d)).
s(d,g,go(d,g)).
s(g,d,go(g,d)).
s(e,g,go(e,g)).
s(g,e,go(g,e)).
Я знаю, что рекурсивный предикат bfs_b должен быть реализован в исходном коде. У нас есть следующий код для планирования на будущее:
fp(S,G,P) :-
list_to_set(S,SS),
list_to_set(G,GS),
fp(SS,GS,[],R),
reverse(R,P).
% fp(+StateSet,+GoalsSet,+Operators,-Plan)
fp(S,G,P,P) :- holds(G,S).
fp(S,G,Os,P) :-
pop(O,Pre,A,D),
holds(Pre,S),
\+ member(O,Os),
apply(S,A,D,S1),
fp(S1,G,[O|Os],P).
% holds(+Goals,+State): the goals (or preconditions) Goals hold in State
holds([],_).
holds([Pre|Ps],S) :-
select(Pre,S,S1),
holds(Ps,S1).
% apply(+State,+AddList,+DeleteList,-NewState): NewState is the result of updating State with AddList and DeleteList
apply(S,A,D,S1) :-
subtract(S,D,S2),
union(A,S2,S1).
pop(move(X,Y),
[block(X),block(Y),on(X,Z),
clear(X),clear(Y)],
[clear(Z),on(X,Y)],
[clear(Y),on(X,Z)]).
pop(move_to_table(X),
[block(X),block(Y),on(X,Y),clear(X)],
[on(X,table),clear(Y)],
[on(X,Y)]).
Я знаю, что должен изменить предикат fp / 4 в соответствии с предикатом bfs_b, но я просто не знаю, как ... Если бы кто-то мог помогите мне, это было бы очень ценно! Это последний шаг в моем назначении, поэтому помощь будет потрясающей!