Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

pl:prolog:pllib:regression_planner [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
 +====== Regression planner ======
 +{{tag>​planning problem_solving}}
 +===== Description =====
 +A planner based on goal regression.
 +
 +
 +**Source**: ​ PROLOG programming for artificial intelligence,​ 3rd Edition, Harlow, 2001, ISBN 0-201-40375-7.
 +
 +
 +===== Download =====
 +Program source code: {{regression_planner.pl}}
 +
 +===== Listing =====
 +<code prolog>
 +%   ​Figure ​ 17.8  A planner based on goal regression. ​
 +
 +%   This planner searches in iterative-deepening style.
 +
 +
 +
 +:- op( 900, fy, not).
 +
 +
 +
 +% not Goal): negation as failure; ​
 +
 +%   Note: This is often available as a built-in predicate,
 +
 +%   often written as prefix operator "​\+",​ e.g. \+ likes(mary,​snakes)
 +
 +
 +
 +not Goal  :-
 +
 +  Goal, !, fail
 +
 +  ; 
 +
 +  true.
 +
 +
 +
 +%   A means-ends planner with goal regression
 +
 +%   plan( State, Goals, Plan)
 +
 +plan( State, Goals, [])  :-
 +
 +  satisfied( State, Goals). ​                  % Goals true in State
 +
 +
 +
 +plan( State, Goals, Plan)  :-
 +
 +  conc( PrePlan, [Action], Plan), ​            % Divide plan achieving breadth-first effect
 +
 +  select( State, Goals, Goal), ​               % Select a goal
 +
 +  achieves( Action, Goal),
 +
 +  can( Action, Condition), ​                   % Ensure Action contains no variables
 +
 +  preserves( Action, Goals), ​                 % Protect Goals
 +
 +  regress( Goals, Action, RegressedGoals), ​   % Regress Goals through Action
 +
 +  plan( State, RegressedGoals,​ PrePlan).
 +
 +
 +
 +satisfied( State, Goals) ​ :-
 +
 +  delete_all( Goals, State, []).              % All Goals in State
 +
 +
 +
 +select( State, Goals, Goal)  :-               % Select Goal from Goals
 +
 +  member( Goal, Goals). ​                      % A simple selection principle
 +
 +
 +
 +achieves( Action, Goal)  :-
 +
 +  adds( Action, Goals),
 +
 +  member( Goal, Goals).
 +
 +
 +
 +preserves( Action, Goals) ​ :-                 % Action does not destroy Goals
 +
 +  deletes( Action, Relations),
 +
 +  not (member( Goal, Relations),
 +
 +       ​member( Goal, Goals) ).
 +
 +
 +
 +regress( Goals, Action, RegressedGoals) ​ :-       % Regress Goals through Action
 +
 +  adds( Action, NewRelations),​
 +
 +  delete_all( Goals, NewRelations,​ RestGoals),
 +
 +  can( Action, Condition),
 +
 +  addnew( Condition, RestGoals, RegressedGoals). ​ % Add precond., check imposs.
 +
 +
 +
 +% addnew( NewGoals, OldGoals, AllGoals):
 +
 +%   ​OldGoals is the union of NewGoals and OldGoals
 +
 +%   ​NewGoals and OldGoals must be compatible
 +
 +
 +
 +addnew( [], L, L).
 +
 +
 +
 +addnew( [Goal | _], Goals, _)  :-
 +
 +  impossible( Goal, Goals), ​        % Goal incompatible with Goals
 +
 +  !, 
 +
 +  fail.                             % Cannot be added
 +
 +
 +
 +addnew( [X | L1], L2, L3)  :-
 +
 +  member( X, L2),  !,               % Ignore duplicate
 +
 +  addnew( L1, L2, L3).
 +
 +
 +
 +addnew( [X | L1], L2, [X | L3])  :-
 +
 +  addnew( L1, L2, L3).
 +
 +
 +
 +% delete_all( L1, L2, Diff): Diff is set-difference of lists L1 and L2
 +
 +
 +
 +delete_all( [], _, []).
 +
 +
 +
 +delete_all( [X | L1], L2, Diff)  :-
 +
 +  member( X, L2), !,
 +
 +  delete_all( L1, L2, Diff).
 +
 +
 +
 +delete_all( [X | L1], L2, [X | Diff]) ​ :-
 +
 +  delete_all( L1, L2, Diff).
 +
 +</​code>​
 +===== Comments =====
  
pl/prolog/pllib/regression_planner.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0