Пролог: изменить глубину первого поиска на первый поиск - PullRequest
1 голос
/ 28 марта 2020

У меня есть задание для пролога, где я нахожусь на последнем этапе, но я просто не могу закончить 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, но я просто не знаю, как ... Если бы кто-то мог помогите мне, это было бы очень ценно! Это последний шаг в моем назначении, поэтому помощь будет потрясающей!

...