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 }