• Ingen resultater fundet

had more time to work on this project, I would definitely prioritize a better search strategy that takes a heurstic function, such as FAF, into consideration

In document Planning in Multi-Agent Systems (Sider 33-55)

Chapter 6

Conclusion

I have made myself familiar with the GOAL agent programming language and the structure of its codebase in order to extend the language with planning capabilities. I have integrated a planning module that hooks in to the GOAL runtime and implemented a version of the partial-order planning algorithm in Java.

The planning module is unfortunately not in a state that makes it practical to use in a GOAL agent program, as the planning algorithm is not guided by a heuristic. It does, however, find a solution plan for the small example problem I set up and the methods for manipulating a partial plan structure appear to be working as intended.

If I had more time to work on this project, I would definitely prioritize a better

Appendix A

Appendix

A.1 Source code listing

src/test/resources/goal/tools/plan/plan.goal

1 i n i t m o d u l e { 2 k n o w l e d g e { 3 b l o c k ( a ) . 4 b l o c k ( b ) . 5 b l o c k ( c ) . 6 c l e a r ( t a b l e ) .

7 }

8

9 b e l i e f s {

10 on ( c , a ) .

11 on ( a , t a b l e ) . 12 on ( b , t a b l e ) .

13 c l e a r ( c ) .

14 c l e a r ( b ) .

15 }

16

17 g o a l s {

18 on ( a , b ) , on ( b , c ) .

19 }

20

21 a c t i o n s p e c {

22 m o v e 1 ( X , Y , Z ) @ i n t {

23 pre { b l o c k ( X ) , b l o c k ( Z ) , on ( X , Y ) , c l e a r ( X ) , c l e a r ( Z ) } 24 p o s t { on ( X , Z ) , not ( on ( X , Y ) ) , c l e a r ( Y ) , not ( c l e a r ( Z ) ) }

25 }

26

27 m o v e 2 ( X , Y ) @ i n t {

28 pre { b l o c k ( X ) , on ( X , Y ) , c l e a r ( X ) }

29 p o s t { on ( X , t a b l e ) , not ( on ( X , Y ) ) , c l e a r ( Y ) }

30 }

31 }

32 } 33

34 m a i n m o d u l e [ e x i t = n o g o a l s ] { 35 p r o g r a m [ o r d e r = p l a n ] { 36 % d u m m y a c t i o n r u l e 37 if t r u e t h e n p r i n t (0) .

38 }

39 }

src/test/java/goal/tools/plan/PlannerTest.java

1 p a c k a g e g o a l . t o o l s . p l a n ; 2

3 i m p o r t s t a t i c org . j u n i t . A s s e r t . a s s e r t F a l s e ; 4 i m p o r t s t a t i c org . j u n i t . A s s e r t . a s s e r t N u l l ; 5 i m p o r t s t a t i c org . j u n i t . A s s e r t . a s s e r t T r u e ; 6 i m p o r t g o a l . c o r e . a g e n t . A g e n t ;

7 i m p o r t g o a l . c o r e . a g e n t . A g e n t I d ;

8 i m p o r t g o a l . c o r e . a g e n t . E n v i r o n m e n t C a p a b i l i t i e s ; 9 i m p o r t g o a l . c o r e . a g e n t . G O A L I n t e r p r e t e r ;

10 i m p o r t g o a l . c o r e . a g e n t . L o g g i n g C a p a b i l i t i e s ; 11 i m p o r t g o a l . c o r e . a g e n t . M e s s a g i n g C a p a b i l i t i e s ; 12 i m p o r t g o a l . c o r e . a g e n t . N o E n v i r o n m e n t C a p a b i l i t i e s ; 13 i m p o r t g o a l . c o r e . a g e n t . N o L o g g i n g C a p a b i l i t i e s ; 14 i m p o r t g o a l . c o r e . a g e n t . N o M e s s a g i n g C a p a b i l i t i e s ; 15 i m p o r t g o a l . c o r e . kr . K R l a n g u a g e ;

16 i m p o r t g o a l . c o r e . p r o g r a m . G O A L P r o g r a m ; 17 i m p o r t g o a l . t o o l s . P l a t f o r m M a n a g e r ; 18 i m p o r t g o a l . t o o l s . a d a p t . F i l e L e a r n e r ; 19 i m p o r t g o a l . t o o l s . a d a p t . L e a r n e r ; 20 i m p o r t g o a l . t o o l s . d e b u g g e r . N O P D e b u g g e r ; 21 i m p o r t g o a l . t o o l s . l o g g i n g . L o g g e r s ; 22

23 i m p o r t j a v a . io . F i l e ; 24

25 i m p o r t org . j u n i t . A f t e r ; 26 i m p o r t org . j u n i t . A f t e r C l a s s ; 27 i m p o r t org . j u n i t . B e f o r e ; 28 i m p o r t org . j u n i t . B e f o r e C l a s s ; 29 i m p o r t org . j u n i t . T e s t ; 30

31 i m p o r t s w i p r o l o g 3 . e n g i n e s . S W I P r o l o g L a n g u a g e ; 32

33 p u b l i c c l a s s P l a n n e r T e s t { 34

35 @ B e f o r e C l a s s

36 p u b l i c s t a t i c v o i d s e t u p B e f o r e C l a s s () { 37 L o g g e r s . a d d C o n s o l e L o g g e r () ;

38 }

39

40 @ A f t e r C l a s s

41 p u b l i c s t a t i c v o i d t e a r D o w n A f t e r C l a s s () { 42 L o g g e r s . r e m o v e C o n s o l e L o g g e r () ;

43 }

44

45 Agent < G O A L I n t e r p r e t e r < N O P D e b u g g e r > > a g e n t ; 46 G O A L I n t e r p r e t e r < N O P D e b u g g e r > c o n t r o l l e r ; 47 K R l a n g u a g e l a n g u a g e ;

A.1 Source code listing 27

48

49 @ B e f o r e

50 p u b l i c v o i d s e t U p () t h r o w s E x c e p t i o n { 51 A g e n t I d id = new A g e n t I d (" T e s t A g e n t ") ; 52 l a n g u a g e = S W I P r o l o g L a n g u a g e . g e t I n s t a n c e () ;

53 F i l e f i l e = new F i l e (" src / t e s t / r e s o u r c e s / g o a l / t o o l s / p l a n / p l a n . g o a l ") ; 54 G O A L P r o g r a m p r o g r a m = P l a t f o r m M a n a g e r . p a r s e G O A L F i l e ( file , l a n g u a g e ) ; 55 M e s s a g i n g C a p a b i l i t i e s m e s s a g i n g C p a b i l i t i e s = new N o M e s s a g i n g C a p a b i l i t i e s

() ;

56 E n v i r o n m e n t C a p a b i l i t i e s e n v i r o n m e n t C a p a b i l i t i e s = new N o E n v i r o n m e n t C a p a b i l i t i e s () ;

57 L o g g i n g C a p a b i l i t i e s l o g g i n g C a p a b i l i t i e s = new N o L o g g i n g C a p a b i l i t i e s () ; 58

59 N O P D e b u g g e r d e b u g g e r = new N O P D e b u g g e r ( id ) ;

60 L e a r n e r l e a r n e r = new F i l e L e a r n e r ( id . g e t N a m e () , p r o g r a m ) ; 61 P l a n n e r p l a n n e r = new P O P P l a n n e r ( p r o g r a m ) ;

62 c o n t r o l l e r = new G O A L I n t e r p r e t e r < N O P D e b u g g e r >( program , d e b u g g e r ,

63 learner , p l a n n e r ) ;

64 a g e n t = new Agent < G O A L I n t e r p r e t e r < N O P D e b u g g e r > >( id , 65 e n v i r o n m e n t C a p a b i l i t i e s , m e s s a g i n g C p a b i l i t i e s , 66 l o g g i n g C a p a b i l i t i e s , c o n t r o l l e r ) ;

67 }

68

69 @ A f t e r

70 p u b l i c v o i d t e a r D o w n () t h r o w s E x c e p t i o n { 71 l a n g u a g e . r e s e t () ;

72 }

73

74 @ T e s t

75 p u b l i c v o i d t e s t S t a r t () t h r o w s I n t e r r u p t e d E x c e p t i o n { 76 c o n t r o l l e r . s t a r t () ;

77 a s s e r t T r u e ( c o n t r o l l e r . i s R u n n i n g () ) ; 78 c o n t r o l l e r . a w a i t T e r m i n a t i o n () ; 79 a s s e r t F a l s e ( c o n t r o l l e r . i s R u n n i n g () ) ;

80 a s s e r t N u l l ( c o n t r o l l e r . g e t U n c a u g h t T h r o w a b l e () ) ;

81 }

82 83 }

src/main/java/goal/core/program/rules/RuleSet.java (Everything but the run method of RuleSet is omitted)

303 /* *

304 * E x e c u t e s t h i s { @ l i n k R u l e S e t }.

305 *

306 * @ p a r a m r u n S t a t e

307 * The run s t a t e in w h i c h the r u l e set is e x e c u t e d . 308 * @ p a r a m s u b s t i t u t i o n

309 * The s u b s t i t u t i o n p r o v i d e d by the m o d u l e c o n t e x t t h a t is p a s s e d

310 * on to t h i s r u l e set .

311 * @ r e t u r n The { @ l i n k R e s u l t } of e x e c u t i n g t h i s r u l e set . 312 * @ t h r o w s K R Q u e r y F a i l e d E x c e p t i o n

313 *

314 * F I X M E : e n a b l e l e a r n e r to d e a l w i t h R u l e # i s S i n g l e G o a l

315 */

316 p u b l i c R e s u l t run ( R u n S t a t e <? > r u n S t a t e , S u b s t i t u t i o n s u b s t i t u t i o n ) { 317 R e s u l t r e s u l t = new R e s u l t () ;

318 // M a k e a c o p y of the r u l e s so we don ’ t s h u f f l e the o r i g i n a l b e l o w . 319 A r r a y L i s t < Rule > r u l e s = new A r r a y L i s t < Rule >(t h i s. r u l e s ) ;

320 M e n t a l S t a t e ms ; 321

322 s w i t c h ( r u l e O r d e r ) {

323 c a s e P L A N :

324 ms = r u n S t a t e . g e t M e n t a l S t a t e () ; 325

326 Set < S i n g l e G o a l > g o a l s = ms . g e t A t t e n t i o n S e t () . g e t G o a l s () ; 327 if ( g o a l s . i s E m p t y () ) {

328 // No g o a l to p l a n for

329 b r e a k;

330 }

331

332 // S e a r c h for p l a n

333 S i n g l e G o a l g o a l = g o a l s . i t e r a t o r () . n e x t () ;

334 List < Action > p l a n = r u n S t a t e . g e t P l a n n e r () . p l a n ( ms , g o a l ) ; 335

336 if ( p l a n == n u l l) {

337 // No p l a n f o u n d

338 b r e a k;

339 }

340

341 // E x e c u t e p l a n s t e p by s t e p 342 for ( A c t i o n a c t i o n : p l a n ) {

343 r e s u l t = a c t i o n . run ( r u n S t a t e , r u n S t a t e . g e t M e n t a l S t a t e () 344 . g e t K R L a n g u a g e () . g e t E m p t y S u b s t i t u t i o n () ,

345 r u n S t a t e . g e t D e b u g g e r () ) ; 346

347 if ( r e s u l t . h a s P e r f o r m e d A c t i o n () ) {

348 // U p d a t e b e l i e f s

349 r u n S t a t e . s t a r t C y c l e (t r u e) ;

350 } e l s e {

351 // E x i t m o d u l e if p r e c o n d i t i o n f a i l s

352 b r e a k;

353 }

354 }

355

356 b r e a k;

357 c a s e A D A P T I V E : 358 c a s e L I N E A R A D A P T I V E :

359 /*

360 * For now t h e r e is no d i f f e r e n t i a t i o n b e t w e e n a d a p t i v e and l i n e a r 361 * a d a p t i v e o p t i o n s . In b o t h cases , a ’ r a n d o m ’ a c t i o n o p t i o n w i l l be 362 * s e l e c t e d for e x e c u t i o n by the l e a r n e r .

363 */

364

365 ms = r u n S t a t e . g e t M e n t a l S t a t e () ;

366 R u l e S e t r u l e S e t = t h i s. a p p l y S u b s t ( s u b s t i t u t i o n ) ; 367

368 r u n S t a t e . i n c r e m e n t R o u n d C o u n t e r () ; 369 r u n S t a t e . g e t D e b u g g e r () . b r e a k p o i n t ( 370 C h a n n e l . R E A S O N I N G _ C Y C L E _ S E P A R A T O R ,

371 null,

372 " + + + + + + + A d a p t i v e C y c l e " + r u n S t a t e . g e t R o u n d C o u n t e r ()

373 + " + + + + + + + ") ;

374

375 /*

376 * Get the l e a r n e r to c h o o s e one a c t i o n option , f r o m the i n p u t l i s t 377 * of a c t i o n o p t i o n s .

378 */

379 List < A c t i o n C o m b o > o p t i o n s = r u l e S e t . g e t A c t i o n O p t i o n s ( ms , 380 r u n S t a t e . g e t D e b u g g e r () ) ;

381

382 // T h e r e are no p o s s i b l e o p t i o n s for a c t i o n s to e x e c u t e . 383 if ( o p t i o n s . i s E m p t y () ) {

384 b r e a k;

385 }

386

387 // S e l e c t an a c t i o n

A.1 Source code listing 29

388 A c t i o n C o m b o c h o s e n = r u n S t a t e . g e t L e a r n e r () . act (

389 r u n S t a t e . g e t A c t i v e M o d u l e () . g e t N a m e () , ms , o p t i o n s ) ; 390

391 /* Now e x e c u t e the a c t i o n o p t i o n */

392 r e s u l t = c h o s e n . run ( r u n S t a t e , s u b s t i t u t i o n ) ; 393

394 /*

395 * O b t a i n the r e w a r d f r o m the e n v i r o n m e n t . Or , if the e n v i r o n m e n t 396 * d o e s not s u p p o r t rewards , t h e n c r e a t e an i n t e r n a l r e w a r d b a s e d on 397 * w h e t h e r we h a v e a c h i e v e d all our g o a l s or not .

398 */

399 b o o l e a n g o a l s E m p t y = ms . g e t A t t e n t i o n S e t () . g e t G o a l s () . i s E m p t y () ; 400 // r u n S t a t e s h o u l d now h a v e r e w a r d set .

401 D o u b l e e n v R e w a r d = r u n S t a t e . g e t R e w a r d () ;

402 d o u b l e r e w a r d = ( e n v R e w a r d != n u l l) ? e n v R e w a r d : g o a l s E m p t y ? 1.0

403 : 0 . 0 ;

404

405 if (! g o a l s E m p t y ) {

406 /* U p d a t e the l e a r n e r w i t h the r e w a r d f r o m the l a s t a c t i o n */

407 r u n S t a t e . g e t L e a r n e r () . u p d a t e (

408 r u n S t a t e . g e t A c t i v e M o d u l e () . g e t N a m e () , ms , r e w a r d ) ;

409 } e l s e {

410 /*

411 * If g o a l s w e r e a c h i e v e d , t h e n the f i n a l r e w a r d is c a l c u l a t e d , 412 * and the l e a r n i n g e p i s o d e f i n i s h e d , in R u n S t a t e . k i l l () w h e n

413 * the a g e n t is k i l l e d .

414 */

415 }

416 b r e a k;

417 c a s e R A N D O M :

418 C o l l e c t i o n s . s h u f f l e ( r u l e s ) ; 419 c a s e L I N E A R :

420 for ( R u l e r u l e : r u l e s ) {

421 r e s u l t = r u l e . run ( r u n S t a t e , s u b s t i t u t i o n ) ; 422 if ( r e s u l t . i s F i n i s h e d () ) {

423 b r e a k;

424 }

425 }

426 b r e a k;

427 c a s e R A N D O M A L L :

428 C o l l e c t i o n s . s h u f f l e ( r u l e s ) ; 429 c a s e L I N E A R A L L :

430 // C o n t i n u e e v a l u a t i n g and a p p l y i n g r u l e as l o n g as t h e r e are more , 431 // and no { @ l i n k E x i t M o d u l e A c t i o n } has b e e n p e r f o r m e d .

432 for ( R u l e r u l e : r u l e s ) {

433 r e s u l t . m e r g e ( r u l e . run ( r u n S t a t e , s u b s t i t u t i o n ) ) ; 434 if ( r e s u l t . i s M o d u l e T e r m i n a t e d () ) {

435 b r e a k;

436 }

437 }

438 b r e a k;

439 }

440

441 r e t u r n r e s u l t ;

442 }

src/main/java/goal/tools/plan/Link.java

1 p a c k a g e g o a l . t o o l s . p l a n ; 2

3 i m p o r t g o a l . c o r e . kr . l a n g u a g e . D a t a b a s e F o r m u l a ; 4

5 p u b l i c c l a s s L i n k {

6

7 P l a n A c t i o n p r o v i d e r , c o n s u m e r ; 8 D a t a b a s e F o r m u l a p r o p o s i t i o n ; 9

10 p u b l i c L i n k ( P l a n A c t i o n p r o v i d e r , D a t a b a s e F o r m u l a p r o p o s i t i o n , 11 P l a n A c t i o n c o n s u m e r ) {

12 t h i s. p r o v i d e r = p r o v i d e r ; 13 t h i s. p r o p o s i t i o n = p r o p o s i t i o n ; 14 t h i s. c o n s u m e r = c o n s u m e r ;

15 }

16

17 @ O v e r r i d e

18 p u b l i c S t r i n g t o S t r i n g () {

19 r e t u r n " L i n k ( " + p r o v i d e r + " ,\ n " + p r o p o s i t i o n + " , " + c o n s u m e r

20 + " \ n ) \ n ";

21 }

22 23 }

src/main/java/goal/tools/plan/Ordering.java

1 p a c k a g e g o a l . t o o l s . p l a n ; 2

3 p u b l i c c l a s s O r d e r i n g { 4

5 p r i v a t e f i n a l P l a n A c t i o n before , a f t e r ; 6

7 p u b l i c O r d e r i n g ( P l a n A c t i o n before , P l a n A c t i o n a f t e r ) { 8 t h i s. b e f o r e = b e f o r e ;

9 t h i s. a f t e r = a f t e r ;

10 }

11 12 }

src/main/java/goal/tools/plan/OrderingManager.java

1 p a c k a g e g o a l . t o o l s . p l a n ; 2

3 i m p o r t j a v a . u t i l . C o l l e c t i o n s ; 4 i m p o r t j a v a . u t i l . H a s h M a p ; 5 i m p o r t j a v a . u t i l . H a s h S e t ;

6 i m p o r t j a v a . u t i l . I d e n t i t y H a s h M a p ; 7 i m p o r t j a v a . u t i l . L i n k e d L i s t ; 8 i m p o r t j a v a . u t i l . L i s t ; 9 i m p o r t j a v a . u t i l . Map ; 10 i m p o r t j a v a . u t i l . Q u e u e ; 11 i m p o r t j a v a . u t i l . Set ; 12

13 p u b l i c c l a s s O r d e r i n g M a n a g e r { 14

15 p r i v a t e f i n a l Map < P l a n A c t i o n , Set < P l a n A c t i o n > > o r d e r i n g s = new I d e n t i t y H a s h M a p < P l a n A c t i o n , Set < P l a n A c t i o n > >() ;

16 p r i v a t e f i n a l Map < P l a n A c t i o n , Set < P l a n A c t i o n > > c l o s u r e = new I d e n t i t y H a s h M a p < P l a n A c t i o n , Set < P l a n A c t i o n > >() ;

17 18 /* *

19 * C h e c k w h e t h e r or not an o r d e r i n g c o n s t r a i n t is c o n s i s t e n t w i t h the r e s t .

20 *

21 * @ p a r a m a

22 * p l a n a c t i o n t h a t c o m e s f i r s t .

A.1 Source code listing 31

23 * @ p a r a m b

24 * p l a n a c t i o n t h a t c o m e s a f t e r .

25 * @ r e t u r n < code > true </ code > iff the o r d e r i n g c o n s t r a i n t is c o n s i s t e n t w i t h

26 * the r e s t .

27 */

28 p u b l i c b o o l e a n i s C o n s i s t e n t ( P l a n A c t i o n a , P l a n A c t i o n b ) { 29 // C h e c k for c y c l e s

30 Set < P l a n A c t i o n > a f t e r B = c l o s u r e . get ( b ) ; 31 r e t u r n a f t e r B == n u l l || ! a f t e r B . c o n t a i n s ( a ) ;

32 }

33 34 /* *

35 * Get all p l a n a c t i o n s t h a t c o m e a f t e r a s p e c i f i c p l a n a c t i o n .

36 *

37 * @ p a r a m a

38 * p l a n a c t i o n .

39 * @ r e t u r n A set of a c t i o n s t h a t c o m e a f t e r the a c t i o n s p e c i f i e d .

40 */

41 p u b l i c Set < P l a n A c t i o n > a f t e r ( P l a n A c t i o n a ) { 42 Set < P l a n A c t i o n > a f t e r = c l o s u r e . get ( a ) ;

43 if ( a f t e r == n u l l) {

44 r e t u r n C o l l e c t i o n s . E M P T Y _ S E T ;

45 }

46 r e t u r n a f t e r ;

47 }

48

49 // T O D O : L e a v e c o n s i s t e n c y c h e c k to c a l l e r ? 50 /* *

51 * Add an o r d e r i n g c o n s t r a i n t if it ’ s c o n s i s t e n t w i t h the r e s t .

52 *

53 * @ p a r a m a

54 * p l a n a c t i o n t h a t c o m e s f i r s t . 55 * @ p a r a m b

56 * p l a n a c t i o n t h a t c o m e s a f t e r .

57 *

58 * @ r e t u r n < code > true </ code > iff o r d e r i n g c o n s t r a i n t was a d d e d s u c c e s s f u l l y .

59 */

60 p u b l i c b o o l e a n a d d I f C o n s i s t e n t ( P l a n A c t i o n a , P l a n A c t i o n b ) { 61 if (! i s C o n s i s t e n t ( a , b ) ) {

62 r e t u r n f a l s e;

63 }

64

65 Set < P l a n A c t i o n > a f t e r A = o r d e r i n g s . get ( a ) ; 66 Set < P l a n A c t i o n > a f t e r A C l o s e d ;

67

68 if ( a f t e r A == n u l l) {

69 a f t e r A = new HashSet < P l a n A c t i o n >() ; 70 o r d e r i n g s . put ( a , a f t e r A ) ;

71 a f t e r A C l o s e d = new HashSet < P l a n A c t i o n >() ; 72 c l o s u r e . put ( a , a f t e r A C l o s e d ) ;

73 } e l s e {

74 a f t e r A C l o s e d = c l o s u r e . get ( a ) ;

75 }

76

77 Set < P l a n A c t i o n > a f t e r B C l o s e d = c l o s u r e . get ( b ) ; 78 if ( a f t e r B C l o s e d == n u l l) {

79 a f t e r B C l o s e d = C o l l e c t i o n s . E M P T Y _ S E T ;

80 }

81

82 a f t e r A . add ( b ) ; 83 a f t e r A C l o s e d . add ( b ) ;

84 a f t e r A C l o s e d . a d d A l l ( a f t e r B C l o s e d ) ; 85

86 for ( P l a n A c t i o n a c t i o n : o r d e r i n g s . k e y S e t () ) { 87 Set < P l a n A c t i o n > a f t e r C l o s e d = c l o s u r e . get ( a c t i o n ) ; 88 if ( a f t e r C l o s e d != n u l l && a f t e r C l o s e d . c o n t a i n s ( a ) ) { 89 a f t e r C l o s e d . add ( b ) ;

90 a f t e r C l o s e d . a d d A l l ( a f t e r B C l o s e d ) ;

91 }

92 }

93

94 r e t u r n t r u e;

95 }

96 97 /* *

98 * R e m o v e an o r d e r i n g c o n s t r a i n t . N o t e t h a t t h i s w i l l t r i g g e r a 99 * re - p r o p a g a t i o n of the t r a n s i t i v e c l o s u r e .

100 *

101 * @ p a r a m a

102 * p l a n a c t i o n t h a t c o m e s f i r s t . 103 * @ p a r a m b

104 * p l a n a c t i o n t h a t c o m e s a f t e r .

105 * @ r e t u r n < code > true </ code > iff t h i s u p d a t e had any e f f e c t .

106 */

107 p u b l i c b o o l e a n r e m o v e ( P l a n A c t i o n a , P l a n A c t i o n b ) { 108 Set < P l a n A c t i o n > a f t e r A = o r d e r i n g s . get ( a ) ; 109 if ( a f t e r A == n u l l || ! a f t e r A . c o n t a i n s ( b ) ) {

110 r e t u r n f a l s e;

111 }

112

113 // C o m p u t e l i n e a r i z a t i o n b e f o r e r e m o v a l

114 List < P l a n A c t i o n > l i n e a r i z a t i o n = g e t L i n e a r i z a t i o n () ; 115

116 // R e m o v e o r d e r i n g c o n s t r a i n t 117 a f t e r A . r e m o v e ( b ) ;

118 if ( a f t e r A . i s E m p t y () ) { 119 o r d e r i n g s . r e m o v e ( a ) ;

120 }

121

122 // Re - p r o p a g a t e t r a n s i t i v e c l o s u r e 123 c l o s u r e . c l e a r () ;

124

125 for (int i = l i n e a r i z a t i o n . s i z e () - 1; i >= 0; i - -) { 126 P l a n A c t i o n x = l i n e a r i z a t i o n . get ( i ) ;

127 Set < P l a n A c t i o n > a f t e r X C l o s e d = c l o s u r e . get ( x ) ; 128

129 for (int j = i - 1; j >= 0; j - -) {

130 P l a n A c t i o n y = l i n e a r i z a t i o n . get ( j ) ; 131

132 Set < P l a n A c t i o n > a f t e r Y = o r d e r i n g s . get ( y ) ; 133 if ( a f t e r Y != n u l l && a f t e r Y . c o n t a i n s ( x ) ) { 134 Set < P l a n A c t i o n > a f t e r Y C l o s e d = c l o s u r e . get ( y ) ;

135 if ( a f t e r Y C l o s e d == n u l l) {

136 a f t e r Y C l o s e d = new HashSet < P l a n A c t i o n >() ; 137 c l o s u r e . put ( y , a f t e r Y C l o s e d ) ;

138 }

139

140 a f t e r Y C l o s e d . add ( x ) ;

141 if ( a f t e r X C l o s e d != n u l l) {

142 a f t e r Y C l o s e d . a d d A l l ( a f t e r X C l o s e d ) ;

143 }

144 }

145 }

146 }

147

148 r e t u r n t r u e;

149 }

150

A.1 Source code listing 33

151 /* *

152 * C o m p u t e a t o p o l o g i c a l s o r t of the o r d e r i n g c o n s t r a i n t s .

153 *

154 * @ r e t u r n A total - o r d e r p l a n t h a t s a t i s f i e s all o r d e r i n g c o n s t r a i n t s .

155 */

156 p u b l i c List < P l a n A c t i o n > g e t L i n e a r i z a t i o n () {

157 List < P l a n A c t i o n > l i n e a r i z a t i o n = new L i n k e d L i s t < P l a n A c t i o n >() ; 158

159 // M a k e c o p y of o r d e r i n g s

160 Map < P l a n A c t i o n , Set < P l a n A c t i o n > > e d g e s = new HashMap < P l a n A c t i o n , Set <

P l a n A c t i o n > >(

161 o r d e r i n g s ) ;

162

163 // F i n d n o d e s w i t h no i n c o m i n g e d g e s

164 Queue < P l a n A c t i o n > n o I n c o m i n g = new L i n k e d L i s t < P l a n A c t i o n >(

165 o r d e r i n g s . k e y S e t () ) ;

166 for ( Set < P l a n A c t i o n > a c t i o n s : o r d e r i n g s . v a l u e s () ) { 167 n o I n c o m i n g . r e m o v e A l l ( a c t i o n s ) ;

168 }

169

170 w h i l e (! n o I n c o m i n g . i s E m p t y () ) { 171 P l a n A c t i o n n = n o I n c o m i n g . p o l l () ; 172 l i n e a r i z a t i o n . add ( n ) ;

173

174 Set < P l a n A c t i o n > a f t e r N = e d g e s . get ( n ) ;

175 if ( a f t e r N == n u l l) {

176 c o n t i n u e;

177 }

178

179 e d g e s . r e m o v e ( n ) ; 180

181 f o r A f t e r N : for ( P l a n A c t i o n m : a f t e r N ) {

182 for ( Set < P l a n A c t i o n > a c t i o n s : e d g e s . v a l u e s () ) { 183 if ( a c t i o n s . c o n t a i n s ( m ) ) {

184 c o n t i n u e f o r A f t e r N ;

185 }

186 }

187

188 n o I n c o m i n g . add ( m ) ;

189 }

190

191 }

192

193 r e t u r n l i n e a r i z a t i o n ;

194 }

195 }

src/main/java/goal/tools/plan/POPPlanner.java

1 p a c k a g e g o a l . t o o l s . p l a n ; 2

3 i m p o r t g o a l . c o r e . kr . l a n g u a g e . D a t a b a s e F o r m u l a ; 4 i m p o r t g o a l . c o r e . kr . l a n g u a g e . S u b s t i t u t i o n ; 5 i m p o r t g o a l . c o r e . m e n t a l s t a t e . B A S E T Y P E ; 6 i m p o r t g o a l . c o r e . m e n t a l s t a t e . B e l i e f B a s e ; 7 i m p o r t g o a l . c o r e . m e n t a l s t a t e . M e n t a l S t a t e ; 8 i m p o r t g o a l . c o r e . m e n t a l s t a t e . S i n g l e G o a l ; 9 i m p o r t g o a l . c o r e . p r o g r a m . A c t i o n S p e c i f i c a t i o n ; 10 i m p o r t g o a l . c o r e . p r o g r a m . G O A L P r o g r a m ;

11 i m p o r t g o a l . c o r e . p r o g r a m . a c t i o n s . A c t i o n ; 12

13 i m p o r t j a v a . u t i l . A r r a y L i s t ; 14 i m p o r t j a v a . u t i l . C o l l e c t i o n s ;

15 i m p o r t j a v a . u t i l . H a s h S e t ; 16 i m p o r t j a v a . u t i l . L i n k e d L i s t ; 17 i m p o r t j a v a . u t i l . L i s t ; 18 i m p o r t j a v a . u t i l . Set ; 19

20 p u b l i c c l a s s P O P P l a n n e r i m p l e m e n t s P l a n n e r { 21

22 p r i v a t e c l a s s A g e n d a P a i r { 23

24 p u b l i c P l a n A c t i o n a c t i o n ;

25 p u b l i c D a t a b a s e F o r m u l a p r e c o n d i t i o n ; 26

27 p u b l i c A g e n d a P a i r ( P l a n A c t i o n action , D a t a b a s e F o r m u l a p r e c o n d i t i o n ) { 28 t h i s. a c t i o n = a c t i o n ;

29 t h i s. p r e c o n d i t i o n = p r e c o n d i t i o n ;

30 }

31

32 @ O v e r r i d e

33 p u b l i c S t r i n g t o S t r i n g () {

34 r e t u r n " A g e n d a P a i r ( " + a c t i o n . t o S t r i n g () + " , "

35 + p r e c o n d i t i o n . t o S t r i n g () + " ) ";

36 }

37

38 }

39

40 p r i v a t e c l a s s P r o v i d e r { 41

42 p u b l i c P l a n A c t i o n a c t i o n ; 43 p u b l i c S u b s t i t u t i o n s u b s t ; 44

45 p u b l i c P r o v i d e r ( P l a n A c t i o n action , S u b s t i t u t i o n s u b s t ) { 46 t h i s. a c t i o n = a c t i o n ;

47 t h i s. s u b s t = s u b s t ;

48 }

49

50 @ O v e r r i d e

51 p u b l i c S t r i n g t o S t r i n g () {

52 r e t u r n " P r o v i d e r P a i r ( " + a c t i o n . t o S t r i n g () + " , " + s u b s t . t o S t r i n g ()

53 + " ) ";

54 }

55 }

56

57 p r i v a t e f i n a l S u b s t i t u t i o n e m p t y S u b s t ;

58 p r i v a t e f i n a l List < A c t i o n S p e c i f i c a t i o n > a c t i o n S p e c s ; 59 p r i v a t e l o n g n o n c e ;

60 61 /* *

62 * C r e a t e a new partial - o r d e r p l a n n e r .

63 *

64 * @ p a r a m p r o g r a m

65 * the g o a l p r o g r a m

66 */

67 p u b l i c P O P P l a n n e r ( G O A L P r o g r a m p r o g r a m ) {

68 e m p t y S u b s t = p r o g r a m . g e t K R L a n g u a g e () . g e t E m p t y S u b s t i t u t i o n () ; 69 a c t i o n S p e c s = p r o g r a m . g e t M o d u l e (" i n i t ") . g e t A c t i o n S p e c i f i c a t i o n s () ;

70 }

71

72 @ O v e r r i d e

73 p u b l i c List < Action > p l a n ( M e n t a l S t a t e ms , S i n g l e G o a l g o a l ) {

74 n o n c e = 0;

75

76 Set < D a t a b a s e F o r m u l a > s t a r t A c t i o n P o s i t i v e E f f e c t s = new HashSet <

D a t a b a s e F o r m u l a >() ;

77 B e l i e f B a s e bb = ms . g e t O w n B a s e ( B A S E T Y P E . B E L I E F B A S E ) ; 78 B e l i e f B a s e kb = ms . g e t O w n B a s e ( B A S E T Y P E . K N O W L E D G E B A S E ) ;

A.1 Source code listing 35

79 s t a r t A c t i o n P o s i t i v e E f f e c t s . a d d A l l ( bb . g e t T h e o r y () . g e t F o r m u l a s () ) ; 80 s t a r t A c t i o n P o s i t i v e E f f e c t s . a d d A l l ( kb . g e t T h e o r y () . g e t F o r m u l a s () ) ; 81

82 Set < D a t a b a s e F o r m u l a > f i n i s h A c t i o n P r e c o n d i t i o n s = new HashSet <

D a t a b a s e F o r m u l a >() ;

83 f i n i s h A c t i o n P r e c o n d i t i o n s . a d d A l l ( g o a l . g e t G o a l () . g e t A d d L i s t () ) ; 84

85 P l a n A c t i o n s t a r t A c t i o n = new P l a n A c t i o n (null, C o l l e c t i o n s . E M P T Y _ S E T , 86 s t a r t A c t i o n P o s i t i v e E f f e c t s , C o l l e c t i o n s . E M P T Y _ S E T ) ;

87 P l a n A c t i o n f i n i s h A c t i o n = new P l a n A c t i o n (null, 88 f i n i s h A c t i o n P r e c o n d i t i o n s , C o l l e c t i o n s . E M P T Y _ S E T , 89 C o l l e c t i o n s . E M P T Y _ S E T ) ;

90

91 P l a n p l a n = new P l a n ( s t a r t A c t i o n , f i n i s h A c t i o n , e m p t y S u b s t ) ; 92 L i n k e d L i s t < A g e n d a P a i r > a g e n d a = new L i n k e d L i s t < A g e n d a P a i r >() ; 93

94 for ( D a t a b a s e F o r m u l a p r e c o n d i t i o n : f i n i s h A c t i o n P r e c o n d i t i o n s ) { 95 a g e n d a . add (new A g e n d a P a i r ( f i n i s h A c t i o n , p r e c o n d i t i o n ) ) ;

96 }

97

98 p l a n = pop ( plan , a g e n d a ) ;

99 if ( p l a n != n u l l) {

100 r e t u r n p l a n . g e t L i n e a r i z a t i o n () ;

101 }

102

103 // No p l a n f o u n d 104 r e t u r n n u l l;

105 }

106

107 // W i l l m u t a t e p l a n !

108 p r i v a t e P l a n pop ( P l a n plan , L i n k e d L i s t < A g e n d a P a i r > a g e n d a ) { 109 if ( a g e n d a . i s E m p t y () ) {

110 // N o t h i n g to do , all sub - g o a l s s a t i s f i e d

111 r e t u r n p l a n ;

112 }

113

114 // N e x t sub - g o a l to s a t i s f y 115 A g e n d a P a i r p a i r = a g e n d a . p o l l () ; 116

117 List < P r o v i d e r > p r o v i d e r s = g e t P r o v i d e r s ( pair , p l a n ) ; 118

119 // Non - d e t e r m i n i s t i c c h o i c e of r e l e v a n t a c t i o n 120 for ( P r o v i d e r p r o v i d e r : p r o v i d e r s ) {

121 P l a n A c t i o n a c t i o n = p r o v i d e r . a c t i o n ; 122 S u b s t i t u t i o n s u b s t = p r o v i d e r . s u b s t ; 123

124 // U p d a t e b i n d i n g c o n s t r a i n t s 125 S u b s t i t u t i o n o l d S u b s t = p l a n . s u b s t ;

126 S u b s t i t u t i o n n e w S u b s t = p l a n . s u b s t . c o m b i n e ( s u b s t ) ;

127 if ( n e w S u b s t == n u l l) {

128 c o n t i n u e;

129 }

130 p l a n . s u b s t = n e w S u b s t ; 131

132 // Add c a u s a l l i n k

133 L i n k l i n k = new L i n k ( action , p a i r . p r e c o n d i t i o n , p a i r . a c t i o n ) ; 134 p l a n . l i n k s . add ( l i n k ) ;

135

136 b o o l e a n i s N e w A c t i o n = ! p l a n . a c t i o n s . c o n t a i n s ( a c t i o n ) ;

137 if ( i s N e w A c t i o n ) {

138 p l a n . a c t i o n s . add ( a c t i o n ) ; 139

140 p l a n . o r d e r i n g M a n a g e r . a d d I f C o n s i s t e n t ( p l a n . start , a c t i o n ) ; 141 p l a n . o r d e r i n g M a n a g e r . a d d I f C o n s i s t e n t ( action , p l a n . f i n i s h ) ; 142

143 for ( D a t a b a s e F o r m u l a p r e c o n d i t i o n : a c t i o n . g e t P r e c o n d i t i o n s () ) { 144 a g e n d a . p u s h (new A g e n d a P a i r ( action , p r e c o n d i t i o n ) ) ;

145 }

146 }

147

148 if ( p l a n . o r d e r i n g M a n a g e r . a d d I f C o n s i s t e n t ( action , p a i r . a c t i o n ) ) { 149 L i n k e d L i s t < Threat > t h r e a t s = g e t T h r e a t s ( plan , i s N e w A c t i o n ,

150 action , l i n k ) ;

151

152 P l a n r e s u l t = p o p 2 ( plan , agenda , t h r e a t s ) ;

153 if ( r e s u l t != n u l l) {

154 r e t u r n r e s u l t ;

155 }

156

157 // T O D O : T h e s e r e m o v a l s w i l l all t r i g g e r re - p r o p a g a t i o n ! 158 p l a n . o r d e r i n g M a n a g e r . r e m o v e ( action , p a i r . a c t i o n ) ;

159 }

160

161 // R e m o v e new a c t i o n

162 if ( i s N e w A c t i o n ) {

163 for (int i = 0; i < a c t i o n . g e t P r e c o n d i t i o n s () . s i z e () ; i ++) {

164 a g e n d a . pop () ;

165 }

166

167 // T O D O : T h e s e r e m o v a l s w i l l all t r i g g e r re - p r o p a g a t i o n ! 168 p l a n . o r d e r i n g M a n a g e r . r e m o v e ( action , p l a n . f i n i s h ) ; 169 p l a n . o r d e r i n g M a n a g e r . r e m o v e ( p l a n . start , a c t i o n ) ; 170

171 p l a n . a c t i o n s . r e m o v e ( a c t i o n ) ;

172 }

173

174 // R e m o v e c a u s a l l i n k 175 p l a n . l i n k s . r e m o v e ( l i n k ) ; 176

177 // R e v e r t b i n d i n g c o n s t r a i n t s 178 p l a n . s u b s t = o l d S u b s t ;

179 }

180

181 // F a i l : R e l e v a n t a c t i o n s e x h a u s t e d 182 r e t u r n n u l l;

183 }

184

185 p r i v a t e P l a n p o p 2 ( P l a n plan , L i n k e d L i s t < A g e n d a P a i r > agenda , 186 L i n k e d L i s t < Threat > t h r e a t s ) {

187 if ( t h r e a t s . i s E m p t y () ) {

188 r e t u r n pop ( plan , ( L i n k e d L i s t < A g e n d a P a i r >) a g e n d a . c l o n e () ) ;

189 }

190

191 T h r e a t t h r e a t = t h r e a t s . pop () ;

192 List < R e s o l v e r > r e s o l v e r s = t h r e a t . g e t R e s o l v e r s ( p l a n ) ; 193

194 // R e s o l v e r s : promote , demote , b i n d i n g c o n s t r a i n t ? 195 for ( R e s o l v e r r e s o l v e r : r e s o l v e r s ) {

196 if (! r e s o l v e r . a p p l y () ) {

197 c o n t i n u e;

198 }

199

200 P l a n r e s u l t = p o p 2 ( plan , agenda ,

201 ( L i n k e d L i s t < Threat >) t h r e a t s . c l o n e () ) ;

202 if ( r e s u l t != n u l l) {

203 r e t u r n r e s u l t ;

204 }

205

206 r e s o l v e r . r e v e r t () ;

207 }

A.1 Source code listing 37

208

209 // F a i l : R e s o l v e r s e x h a u s t e d 210 r e t u r n n u l l;

211 }

212

213 p r i v a t e List < P r o v i d e r > g e t P r o v i d e r s ( A g e n d a P a i r pair , P l a n p l a n ) { 214 List < P r o v i d e r > p r o v i d e r s = new A r r a y L i s t < P r o v i d e r >() ;

215

216 // T O D O : M u l t i p l e p r o v i d e r s for s a m e a c t i o n ? 217

218 // Add r e l e v a n t e x i s t i n g a c t i o n s

219 for ( P l a n A c t i o n a c t i o n : p l a n . a c t i o n s ) {

220 // T O D O : E n s u r e a c t i o n can be o r d e r e d b e f o r e p a i r . a c t i o n ? D o e s t h i s

221 // fix it ?

222 if ( a c t i o n == p a i r . a c t i o n

223 || p l a n . o r d e r i n g M a n a g e r . a f t e r ( p a i r . a c t i o n ) . c o n t a i n s ( a c t i o n ) ) {

224 c o n t i n u e;

225 }

226

227 for ( D a t a b a s e F o r m u l a f o r m u l a : a c t i o n . g e t P o s i t i v e E f f e c t s () ) { 228 S u b s t i t u t i o n s u b s t = f o r m u l a . mgu ( p a i r . p r e c o n d i t i o n ) ; 229

230 // T O D O : A p p l y p l a n . s u b s t to o p e r a n d s b e f o r e mgu ?

231 // E n s u r e the s u b s t i t u t i o n is c o n s i s t e n t w i t h e x i s t i n g b i n d i n g s 232 if ( s u b s t != n u l l && p l a n . s u b s t . c o m b i n e ( s u b s t ) != n u l l) { 233 p r o v i d e r s . add (new P r o v i d e r ( action , s u b s t ) ) ;

234 b r e a k;

235 }

236 }

237 }

238

239 // Add r e l e v a n t new a c t i o n s

240 for ( A c t i o n S p e c i f i c a t i o n a c t i o n S p e c : a c t i o n S p e c s ) {

241 P l a n A c t i o n a c t i o n = new P l a n A c t i o n ( a c t i o n S p e c , n o n c e ++ , e m p t y S u b s t ) ; 242 for ( D a t a b a s e F o r m u l a f o r m u l a : a c t i o n . g e t P o s i t i v e E f f e c t s () ) { 243 S u b s t i t u t i o n s u b s t = f o r m u l a . mgu ( p a i r . p r e c o n d i t i o n ) ;

244 if ( s u b s t != n u l l) {

245 p r o v i d e r s . add (new P r o v i d e r ( action , s u b s t ) ) ;

246 b r e a k;

247 }

248 }

249 }

250

251 r e t u r n p r o v i d e r s ;

252 }

253

254 p r i v a t e s t a t i c b o o l e a n i s T h r e a t ( P l a n plan , P l a n A c t i o n action , L i n k l i n k ) { 255 if (! p l a n . o r d e r i n g M a n a g e r . i s C o n s i s t e n t ( l i n k . p r o v i d e r , a c t i o n )

256 || ! p l a n . o r d e r i n g M a n a g e r . i s C o n s i s t e n t ( action , l i n k . c o n s u m e r ) ) {

257 r e t u r n f a l s e;

258 }

259

260 for ( D a t a b a s e F o r m u l a q : a c t i o n . g e t N e g a t i v e E f f e c t s () ) { 261 S u b s t i t u t i o n s u b s t = l i n k . p r o p o s i t i o n . mgu ( q ) ;

262 if ( s u b s t != n u l l && p l a n . s u b s t . c o m b i n e ( s u b s t ) != n u l l) {

263 r e t u r n t r u e;

264 }

265 }

266

267 r e t u r n f a l s e;

268 }

269

270 p r i v a t e s t a t i c L i n k e d L i s t < Threat > g e t T h r e a t s ( P l a n plan , 271 b o o l e a n i s N e w A c t i o n , P l a n A c t i o n n e w A c t i o n , L i n k n e w L i n k ) { 272 L i n k e d L i s t < Threat > t h r e a t s = new L i n k e d L i s t < Threat >() ;

273

274 // F i n d t h r e a t s due to new a c t i o n 275 if ( i s N e w A c t i o n ) {

276 for ( L i n k l i n k : p l a n . l i n k s ) {

277 if ( l i n k . p r o v i d e r == n e w A c t i o n || l i n k . c o n s u m e r == n e w A c t i o n ) {

278 c o n t i n u e;

279 }

280

281 if ( i s T h r e a t ( plan , n e w A c t i o n , l i n k ) ) { 282 t h r e a t s . add (new T h r e a t ( n e w A c t i o n , l i n k ) ) ;

283 }

284 }

285 }

286

287 // F i n d t h r e a t s on new l i n k

288 for ( P l a n A c t i o n a c t i o n : p l a n . a c t i o n s ) {

289 if ( a c t i o n == n e w L i n k . p r o v i d e r || a c t i o n == n e w L i n k . c o n s u m e r ) {

290 c o n t i n u e;

291 }

292

293 if ( i s T h r e a t ( plan , action , n e w L i n k ) ) { 294 t h r e a t s . add (new T h r e a t ( action , n e w L i n k ) ) ;

295 }

296 }

297

298 r e t u r n t h r e a t s ;

299 }

300 }

src/main/java/goal/tools/plan/Plan.java

1 p a c k a g e g o a l . t o o l s . p l a n ; 2

3 i m p o r t g o a l . c o r e . kr . l a n g u a g e . S u b s t i t u t i o n ; 4 i m p o r t g o a l . c o r e . p r o g r a m . a c t i o n s . A c t i o n ; 5

6 i m p o r t j a v a . u t i l . A r r a y L i s t ; 7 i m p o r t j a v a . u t i l . H a s h S e t ; 8 i m p o r t j a v a . u t i l . L i s t ; 9 i m p o r t j a v a . u t i l . Set ; 10

11 /* *

12 * A p a r t i a l l y i n s t a n t i a t e d partial - o r d e r p l a n . 13 *

14 * @ a u t h o r S . J a c o b i 15 *

16 */

17 p u b l i c c l a s s P l a n { 18

19 p u b l i c f i n a l P l a n A c t i o n start , f i n i s h ;

20 p u b l i c f i n a l Set < P l a n A c t i o n > a c t i o n s = new HashSet < P l a n A c t i o n >() ; 21 p u b l i c f i n a l O r d e r i n g M a n a g e r o r d e r i n g M a n a g e r = new O r d e r i n g M a n a g e r () ; 22 p u b l i c S u b s t i t u t i o n s u b s t ;

23 p u b l i c f i n a l Set < Link > l i n k s = new HashSet < Link >() ; 24

25 /* *

26 * C r e a t e new partial - o r d e r p l a n w i t h p s e u d o a c t i o n s s t a r t and f i n i s h .

27 *

28 * @ p a r a m s t a r t

29 * p l a n a c t i o n w i t h i n i t i a l s t a t e as p o s i t i v e e f f e c t s . 30 * @ p a r a m f i n i s h

31 * p l a n a c t i o n w i t h g o a l s t a t e as p r e c o n d i t i o n s . 32 * @ p a r a m e m p t y S u b s t

A.1 Source code listing 39

33 */

34 p u b l i c P l a n ( P l a n A c t i o n start , P l a n A c t i o n finish , S u b s t i t u t i o n e m p t y S u b s t ) {

35 t h i s. s t a r t = s t a r t ; 36 t h i s. f i n i s h = f i n i s h ; 37 a c t i o n s . add ( s t a r t ) ; 38 a c t i o n s . add ( f i n i s h ) ;

39 o r d e r i n g M a n a g e r . a d d I f C o n s i s t e n t ( start , f i n i s h ) ; 40 s u b s t = e m p t y S u b s t ;

41 }

42 43 /* *

44 * Get one p o s s i b l e f u l l y i n s t a n t i a t e d l i n e a r i z a t i o n of the partial - o r d e r

45 * p l a n .

46 *

47 * @ r e t u r n A l i s t of { @ l i n k A c t i o n } s t h a t d e s c r i b e a p o s s i b l e total - o r d e r .

48 */

49 p u b l i c List < Action > g e t L i n e a r i z a t i o n () {

50 // T O D O : W h a t if f l a w l e s s p l a n is p a r t i a l l y i n s t a n t i a t e d ? 51

52 List < P l a n A c t i o n > p l a n A c t i o n L i n e a r i z a t i o n = o r d e r i n g M a n a g e r 53 . g e t L i n e a r i z a t i o n () ;

54 List < Action > l i n e a r i z a t i o n = new A r r a y L i s t < Action >(

55 p l a n A c t i o n L i n e a r i z a t i o n . s i z e () - 2) ; 56

57 for ( P l a n A c t i o n p l a n A c t i o n : p l a n A c t i o n L i n e a r i z a t i o n ) { 58 A c t i o n a c t i o n = p l a n A c t i o n . g e t A c t i o n () ;

59 if ( a c t i o n != n u l l) {

60 l i n e a r i z a t i o n . add ( a c t i o n . a p p l y S u b s t ( s u b s t ) ) ;

61 }

62 }

63

64 r e t u r n l i n e a r i z a t i o n ;

65 }

66 67 }

src/main/java/goal/tools/plan/PlanAction.java

1 p a c k a g e g o a l . t o o l s . p l a n ; 2

3 i m p o r t g o a l . c o r e . kr . l a n g u a g e . D a t a b a s e F o r m u l a ; 4 i m p o r t g o a l . c o r e . kr . l a n g u a g e . S u b s t i t u t i o n ; 5 i m p o r t g o a l . c o r e . kr . l a n g u a g e . Var ;

6 i m p o r t g o a l . c o r e . p r o g r a m . A c t i o n S p e c i f i c a t i o n ; 7 i m p o r t g o a l . c o r e . p r o g r a m . a c t i o n s . A c t i o n ;

8 i m p o r t g o a l . c o r e . p r o g r a m . a c t i o n s . U s e r S p e c A c t i o n ;

9 i m p o r t g o a l . t o o l s . e r r o r h a n d l i n g . e x c e p t i o n s . K R I n i t F a i l e d E x c e p t i o n ; 10

11 i m p o r t j a v a . u t i l . C o l l e c t i o n s ; 12 i m p o r t j a v a . u t i l . H a s h S e t ; 13 i m p o r t j a v a . u t i l . L i s t ; 14 i m p o r t j a v a . u t i l . Set ; 15

16 p u b l i c c l a s s P l a n A c t i o n { 17

18 p r i v a t e s t a t i c f i n a l S t r i n g V A R I A B L E _ P O S T F I X = " p l a n a c t i o n p o s t f i x ";

19

20 p r i v a t e f i n a l U s e r S p e c A c t i o n a c t i o n ;

21 p r i v a t e f i n a l Set < D a t a b a s e F o r m u l a > p r e c o n d i t i o n s ; 22 p r i v a t e f i n a l Set < D a t a b a s e F o r m u l a > p o s i t i v e E f f e c t s ; 23 p r i v a t e f i n a l Set < D a t a b a s e F o r m u l a > n e g a t i v e E f f e c t s ; 24

25 /* *

26 * C r e a t e new p l a n a c t i o n f r o m a c t i o n s p e c i f i c a t i o n and u n i q u e n o n c e .

27 *

28 * @ p a r a m a c t i o n S p e c

29 * a c t i o n s p e c i f i c a t i o n to c r e a t e p l a n a c t i o n f r o m 30 * @ p a r a m n o n c e

31 * n u m b e r u n i q u e to t h i s c a l l w i t h i n c u r r e n t p l a n s e a r c h 32 * @ p a r a m e m p t y S u b s t

33 * e m p t y s u b s t i t u t i o n for r e l e v a n t kr l a n g u a g e

34 */

35 p u b l i c P l a n A c t i o n ( A c t i o n S p e c i f i c a t i o n a c t i o n S p e c , l o n g nonce , 36 S u b s t i t u t i o n e m p t y S u b s t ) {

37 p r e c o n d i t i o n s = new HashSet < D a t a b a s e F o r m u l a >() ; 38 p o s i t i v e E f f e c t s = new HashSet < D a t a b a s e F o r m u l a >() ; 39 n e g a t i v e E f f e c t s = new HashSet < D a t a b a s e F o r m u l a >() ; 40

41 List < D a t a b a s e F o r m u l a > p r e c o n d i t i o n L i s t = a c t i o n S p e c . g e t P r e C o n d i t i o n () 42 . t o U p d a t e () . g e t A d d L i s t () ;

43 List < D a t a b a s e F o r m u l a > p o s i t i v e E f f e c t s L i s t = a c t i o n S p e c 44 . g e t P o s t C o n d i t i o n () . g e t A d d L i s t () ;

45 List < D a t a b a s e F o r m u l a > n e g a t i v e E f f e c t s L i s t = a c t i o n S p e c 46 . g e t P o s t C o n d i t i o n () . g e t D e l e t e L i s t () ;

47

48 // R e n a m e v a r i a b l e s

49 S u b s t i t u t i o n r e n a m e S u b s t = e m p t y S u b s t ;

50 for ( D a t a b a s e F o r m u l a f o r m u l a : p r e c o n d i t i o n L i s t ) {

51 r e n a m e S u b s t = u p d a t e R e n a m e S u b s t ( r e n a m e S u b s t , formula , n o n c e ) ; 52 p r e c o n d i t i o n s . add ( f o r m u l a . a p p l y S u b s t ( r e n a m e S u b s t ) ) ;

53 }

54 for ( D a t a b a s e F o r m u l a f o r m u l a : p o s i t i v e E f f e c t s L i s t ) {

55 r e n a m e S u b s t = u p d a t e R e n a m e S u b s t ( r e n a m e S u b s t , formula , n o n c e ) ; 56 p o s i t i v e E f f e c t s . add ( f o r m u l a . a p p l y S u b s t ( r e n a m e S u b s t ) ) ;

57 }

58 for ( D a t a b a s e F o r m u l a f o r m u l a : n e g a t i v e E f f e c t s L i s t ) {

59 r e n a m e S u b s t = u p d a t e R e n a m e S u b s t ( r e n a m e S u b s t , formula , n o n c e ) ; 60 n e g a t i v e E f f e c t s . add ( f o r m u l a . a p p l y S u b s t ( r e n a m e S u b s t ) ) ;

61 }

62

63 a c t i o n = a c t i o n S p e c . g e t A c t i o n () . a p p l y S u b s t ( r e n a m e S u b s t ) ; 64

65 try {

66 a c t i o n . a d d S p e c i f i c a t i o n ( a c t i o n S p e c ) ; 67 } c a t c h ( K R I n i t F a i l e d E x c e p t i o n e ) { 68 e . p r i n t S t a c k T r a c e () ;

69 }

70 }

71

72 p u b l i c P l a n A c t i o n ( U s e r S p e c A c t i o n action , 73 Set < D a t a b a s e F o r m u l a > p r e c o n d i t i o n s , 74 Set < D a t a b a s e F o r m u l a > p o s i t i v e E f f e c t s , 75 Set < D a t a b a s e F o r m u l a > n e g a t i v e E f f e c t s ) { 76 t h i s. a c t i o n = a c t i o n ;

77 t h i s. p r e c o n d i t i o n s = p r e c o n d i t i o n s ; 78 t h i s. p o s i t i v e E f f e c t s = p o s i t i v e E f f e c t s ; 79 t h i s. n e g a t i v e E f f e c t s = n e g a t i v e E f f e c t s ;

80 }

81

82 p r i v a t e s t a t i c S u b s t i t u t i o n u p d a t e R e n a m e S u b s t ( S u b s t i t u t i o n subst , 83 D a t a b a s e F o r m u l a formula , l o n g n o n c e ) {

84 for ( Var var : f o r m u l a . g e t F r e e V a r () ) { 85 if (! s u b s t . g e t V a r i a b l e s () . c o n t a i n s ( var ) ) {

86 s u b s t = s u b s t . c o m b i n e ( var . r e n a m e V a r (" ", V A R I A B L E _ P O S T F I X

87 + n o n c e ) ) ;

88 }

89 }

A.1 Source code listing 41

90

91 r e t u r n s u b s t ;

92 }

93

94 p u b l i c A c t i o n g e t A c t i o n () { 95 r e t u r n a c t i o n ;

96 }

97

98 p u b l i c Set < D a t a b a s e F o r m u l a > g e t P r e c o n d i t i o n s () { 99 r e t u r n C o l l e c t i o n s . u n m o d i f i a b l e S e t ( p r e c o n d i t i o n s ) ;

100 }

101

102 p u b l i c Set < D a t a b a s e F o r m u l a > g e t P o s i t i v e E f f e c t s () { 103 r e t u r n C o l l e c t i o n s . u n m o d i f i a b l e S e t ( p o s i t i v e E f f e c t s ) ;

104 }

105

106 p u b l i c Set < D a t a b a s e F o r m u l a > g e t N e g a t i v e E f f e c t s () { 107 r e t u r n C o l l e c t i o n s . u n m o d i f i a b l e S e t ( n e g a t i v e E f f e c t s ) ;

108 }

109

110 @ O v e r r i d e

111 p u b l i c S t r i n g t o S t r i n g () {

112 S t r i n g B u i l d e r sb = new S t r i n g B u i l d e r () ; 113 sb . a p p e n d (" \ n < ") ;

114 sb . a p p e n d ( a c t i o n ) ; 115 sb . a p p e n d (" ,\ n p r e : ") ; 116 sb . a p p e n d ( p r e c o n d i t i o n s ) ; 117 sb . a p p e n d (" ,\ nef +: ") ; 118 sb . a p p e n d ( p o s i t i v e E f f e c t s ) ; 119 sb . a p p e n d (" ,\ nef -: ") ; 120 sb . a p p e n d ( n e g a t i v e E f f e c t s ) ; 121 sb . a p p e n d (" > ") ;

122

123 r e t u r n sb . t o S t r i n g () ;

124 }

125 126 }

src/main/java/goal/tools/plan/Planner.java

1 p a c k a g e g o a l . t o o l s . p l a n ; 2

3 i m p o r t g o a l . c o r e . m e n t a l s t a t e . M e n t a l S t a t e ; 4 i m p o r t g o a l . c o r e . m e n t a l s t a t e . S i n g l e G o a l ; 5 i m p o r t g o a l . c o r e . p r o g r a m . a c t i o n s . A c t i o n ; 6

7 i m p o r t j a v a . u t i l . L i s t ; 8

9 p u b l i c i n t e r f a c e P l a n n e r { 10

11 /* *

12 * S e a r c h for a p l a n to a c h i e v e a s i n g l e g o a l .

13 *

14 * @ p a r a m ms

15 * the c u r r e n t m e n t a l s t a t e

16 * @ p a r a m g o a l

17 * the g o a l to p l a n for

18 * @ r e t u r n A l i s t of { @ l i n k A c t i o n } s t h a t d e s c r i b e s a p l a n to a c h i e v e the 19 * g o a l or { @ c o d e n u l l } if no p l a n is f o u n d .

20 */

21 List < Action > p l a n ( M e n t a l S t a t e ms , S i n g l e G o a l g o a l ) ; 22

23 }

src/main/java/goal/tools/plan/Resolver.java

1 p a c k a g e g o a l . t o o l s . p l a n ; 2

3 p u b l i c i n t e r f a c e R e s o l v e r { 4

5 p u b l i c b o o l e a n a p p l y () ; 6

7 p u b l i c v o i d r e v e r t () ; 8

9 }

src/main/java/goal/tools/plan/ResolverDemote.java

1 p a c k a g e g o a l . t o o l s . p l a n ; 2

3 p u b l i c c l a s s R e s o l v e r D e m o t e i m p l e m e n t s R e s o l v e r { 4

5 p r i v a t e f i n a l P l a n p l a n ; 6 p r i v a t e f i n a l T h r e a t t h r e a t ; 7

8 p u b l i c R e s o l v e r D e m o t e ( P l a n plan , T h r e a t t h r e a t ) { 9 t h i s. p l a n = p l a n ;

10 t h i s. t h r e a t = t h r e a t ;

11 }

12

13 @ O v e r r i d e

14 p u b l i c b o o l e a n a p p l y () {

15 r e t u r n p l a n . o r d e r i n g M a n a g e r . a d d I f C o n s i s t e n t ( t h r e a t . l i n k . c o n s u m e r ,

16 t h r e a t . a c t i o n ) ;

17 }

18

19 @ O v e r r i d e

20 p u b l i c v o i d r e v e r t () {

21 p l a n . o r d e r i n g M a n a g e r . r e m o v e ( t h r e a t . l i n k . c o n s u m e r , t h r e a t . a c t i o n ) ;

22 }

23 24 }

src/main/java/goal/tools/plan/ResolverPromote.java

1 p a c k a g e g o a l . t o o l s . p l a n ; 2

3 p u b l i c c l a s s R e s o l v e r P r o m o t e i m p l e m e n t s R e s o l v e r { 4

5 p r i v a t e f i n a l P l a n p l a n ; 6 p r i v a t e f i n a l T h r e a t t h r e a t ; 7

8 p u b l i c R e s o l v e r P r o m o t e ( P l a n plan , T h r e a t t h r e a t ) { 9 t h i s. p l a n = p l a n ;

10 t h i s. t h r e a t = t h r e a t ;

11 }

12

13 @ O v e r r i d e

14 p u b l i c b o o l e a n a p p l y () {

15 r e t u r n p l a n . o r d e r i n g M a n a g e r . a d d I f C o n s i s t e n t ( t h r e a t . action , 16 t h r e a t . l i n k . p r o v i d e r ) ;

17 }

18

19 @ O v e r r i d e

20 p u b l i c v o i d r e v e r t () {

21 p l a n . o r d e r i n g M a n a g e r . r e m o v e ( t h r e a t . action , t h r e a t . l i n k . p r o v i d e r ) ;

A.1 Source code listing 43

22 }

23 24 }

src/main/java/goal/tools/plan/Threat.java

1 p a c k a g e g o a l . t o o l s . p l a n ; 2

3 i m p o r t j a v a . u t i l . A r r a y L i s t ; 4 i m p o r t j a v a . u t i l . L i s t ; 5

6 p u b l i c c l a s s T h r e a t { 7

8 p u b l i c P l a n A c t i o n a c t i o n ; 9 p u b l i c L i n k l i n k ;

10

11 p u b l i c T h r e a t ( P l a n A c t i o n action , L i n k l i n k ) { 12 t h i s. a c t i o n = a c t i o n ;

13 t h i s. l i n k = l i n k ;

14 }

15

16 p u b l i c List < R e s o l v e r > g e t R e s o l v e r s ( P l a n p l a n ) {

17 List < R e s o l v e r > r e s o l v e r s = new A r r a y L i s t < R e s o l v e r >() ; 18

19 r e s o l v e r s . add (new R e s o l v e r D e m o t e ( plan , t h i s) ) ; 20 r e s o l v e r s . add (new R e s o l v e r P r o m o t e ( plan , t h i s) ) ; 21 // T O D O : R e s o l v e t h r e a t w i t h b i n d i n g c o n s t r a i n t ? 22

23 r e t u r n r e s o l v e r s ;

24 }

25 }

In document Planning in Multi-Agent Systems (Sider 33-55)