1% examples/Mueller2006/Chapter11/HungryCat.e:1 2% translate: begining File: examples/Mueller2006/Chapter11/HungryCat.e.pro 3% ; 4% ; Copyright (c) 2005 IBM Corporation and others. 5% ; All rights reserved. This program and the accompanying materials 6% ; are made available under the terms of the Common Public License v1.0 7% ; which accompanies this distribution, and is available at 8% ; http://www.eclipse.org/legal/cpl-v10.html 9% ; 10% ; Contributors: 11% ; IBM - Initial implementation 12% ; 13% ; @inproceedings{WinikoffEtAl:2002, 14% ; author = "Michael Winikoff and Lin Padgham and James Harland and John Thangarajah", 15% ; year = "2002", 16% ; title = "Declarative \& procedural goals in intelligent agent systems", 17% ; editor = "Dieter Fensel and Fausto Giunchiglia and Deborah McGuinness and Mary-Anne Williams", 18% ; booktitle = "\uppercase{P}roceedings of the \uppercase{E}ighth \uppercase{I}nternational \uppercase{C}onference on \uppercase{P}rinciples of \uppercase{K}nowledge \uppercase{R}epresentation and \uppercase{R}easoning", 19% ; pages = "470--481", 20% ; address = "San Francisco", 21% ; publisher = "Morgan Kaufmann", 22% ; } 23% ; 24% ; @book{Mueller:2006, 25% ; author = "Erik T. Mueller", 26% ; year = "2006", 27% ; title = "Commonsense Reasoning", 28% ; address = "San Francisco", 29% ; publisher = "Morgan Kaufmann/Elsevier", 30% ; } 31% ; 32% examples/Mueller2006/Chapter11/HungryCat.e:30 33% 34% load foundations/Root.e 35load('foundations/Root.e'). 36 37% load foundations/EC.e 38load('foundations/EC.e'). 39 40% 41% sort object 42sort(object). 43 44% sort agent: object 45subsort(agent, object). 46 47% examples/Mueller2006/Chapter11/HungryCat.e:36 48% sort food: object 49subsort(food, object). 50 51% sort surface 52sort(surface). 53 54% sort plan 55sort(plan). 56 57% 58% reified sort belief 59reified_sort(belief). 60 61% 62% examples/Mueller2006/Chapter11/HungryCat.e:42 63% agent Cat 64t(agent, cat). 65 66% surface Floor, Chair, Shelf, Table 67t(surface, floor). 68 69t(surface, chair). 70 71t(surface, shelf). 72 73t(surface, table). 74 75% food Food1, Food2 76t(food, food1). 77 78t(food, food2). 79 80% plan P1, P1a, P1b, P2, P2a 81t(plan, p1). 82 83t(plan, p1a). 84 85t(plan, p1b). 86 87t(plan, p2). 88 89t(plan, p2a). 90 91% 92% predicate SelectedPlan(agent,belief,plan,time) 93predicate(selectedPlan(agent, belief, plan, time)). 94 95% examples/Mueller2006/Chapter11/HungryCat.e:48 96% predicate SoundPlan(agent,belief,plan,time) 97predicate(soundPlan(agent, belief, plan, time)). 98 99% 100% fluent On(object,surface) 101fluent(on(object, surface)). 102 103% fluent Goal(agent,belief) 104fluent(goal(agent, belief)). 105 106% fluent CanJump(surface,surface) 107fluent(canJump(surface, surface)). 108 109% fluent Plan(agent,belief,plan) 110fluent(plan(agent, belief, plan)). 111 112% examples/Mueller2006/Chapter11/HungryCat.e:54 113% fluent Satiated(agent) 114fluent(satiated(agent)). 115 116% fluent Believe(agent,belief) 117fluent(believe(agent, belief)). 118 119% 120% event AddPlan(agent,belief,plan) 121event(addPlan(agent, belief, plan)). 122 123% event DropPlan(agent,belief,plan) 124event(dropPlan(agent, belief, plan)). 125 126% event Jump(agent,surface,surface) 127event(jump(agent, surface, surface)). 128 129% examples/Mueller2006/Chapter11/HungryCat.e:60 130% event Move(surface,surface,surface) 131event(move(surface, surface, surface)). 132 133% event Eat(agent,food) 134event(eat(agent, food)). 135 136% event Wait(agent) 137event(wait(agent)). 138 139% 140% belief BSatiated(agent) 141t(belief, 'bSatiated(agent)'). 142 143% belief BCanJump(surface,surface) 144t(belief, 'bCanJump(surface'). 145 146t(belief, 'surface)'). 147 148% examples/Mueller2006/Chapter11/HungryCat.e:66 149% belief BOn(object,surface) 150t(belief, 'bOn(object'). 151 152t(belief, 'surface)'). 153 154% 155% ; Sigma 156% 157% ; A5 158% examples/Mueller2006/Chapter11/HungryCat.e:71 159% [agent,belief,plan,time]% 160% Initiates(AddPlan(agent,belief,plan),Plan(agent,belief,plan),time). 161initiates(addPlan(Agent, Belief, Plan), plan(Agent, Belief, Plan), Time). 162 163% 164% 165% ; A6 166% examples/Mueller2006/Chapter11/HungryCat.e:75 167% [agent,belief,plan,time]% 168% Terminates(DropPlan(agent,belief,plan),Plan(agent,belief,plan),time). 169terminates(dropPlan(Agent, Belief, Plan), plan(Agent, Belief, Plan), Time). 170 171% 172% 173% examples/Mueller2006/Chapter11/HungryCat.e:78 174% [agent,surface1,surface2,time]% 175% HoldsAt(On(agent,surface1),time) & 176% HoldsAt(CanJump(surface1,surface2),time) -> 177% Initiates(Jump(agent,surface1,surface2),On(agent,surface2),time). 178holds_at(on(Agent, Surface1), Time), holds_at(canJump(Surface1, Surface2), Time) -> 179 initiates(jump(Agent, Surface1, Surface2), 180 on(Agent, Surface2), 181 Time). 182 183% 184% 185% examples/Mueller2006/Chapter11/HungryCat.e:83 186% [agent,surface1,surface2,time]% 187% HoldsAt(On(agent,surface1),time) & 188% HoldsAt(CanJump(surface1,surface2),time) -> 189% Terminates(Jump(agent,surface1,surface2),On(agent,surface1),time). 190holds_at(on(Agent, Surface1), Time), holds_at(canJump(Surface1, Surface2), Time) -> 191 terminates(jump(Agent, Surface1, Surface2), 192 on(Agent, Surface1), 193 Time). 194 195% 196% 197% examples/Mueller2006/Chapter11/HungryCat.e:88 198% [surface1,surface2,surface3,time]% 199% Initiates(Move(surface1,surface2,surface3),CanJump(surface1,surface3),time). 200initiates(move(Surface1, Surface2, Surface3), canJump(Surface1, Surface3), Time). 201 202% 203% 204% examples/Mueller2006/Chapter11/HungryCat.e:91 205% [surface1,surface2,surface3,time]% 206% Terminates(Move(surface1,surface2,surface3),CanJump(surface1,surface2),time). 207terminates(move(Surface1, Surface2, Surface3), canJump(Surface1, Surface2), Time). 208 209% 210% 211% examples/Mueller2006/Chapter11/HungryCat.e:94 212% [agent,food,surface,time]% 213% HoldsAt(On(agent,surface),time) & 214% HoldsAt(On(food,surface),time) -> 215% Initiates(Eat(agent,food),Satiated(agent),time). 216holds_at(on(Agent, Surface), Time), holds_at(on(Food, Surface), Time) -> 217 initiates(eat(Agent, Food), 218 satiated(Agent), 219 Time). 220 221% 222% 223% examples/Mueller2006/Chapter11/HungryCat.e:99 224% [agent,food,surface,time]% 225% HoldsAt(On(agent,surface),time) & 226% HoldsAt(On(food,surface),time) -> 227% Terminates(Eat(agent,food),On(food,surface),time). 228holds_at(on(Agent, Surface), Time), holds_at(on(Food, Surface), Time) -> 229 terminates(eat(Agent, Food), 230 on(Food, Surface), 231 Time). 232 233% 234% 235% examples/Mueller2006/Chapter11/HungryCat.e:104 236% [agent,surface1,surface2,belief,time]% 237% HoldsAt(Believe(agent,BOn(agent,surface1)),time) & 238% HoldsAt(Believe(agent,BCanJump(surface1,surface2)),time) & 239% (belief = BOn(agent,surface2)) -> 240% Initiates(Jump(agent,surface1,surface2), 241% Believe(agent,belief), 242% time). 243holds_at(believe(Agent, bOn(Agent, Surface1)), Time), holds_at(believe(Agent, bCanJump(Surface1, Surface2)), Time), Belief=bOn(Agent, Surface2) -> 244 initiates(jump(Agent, Surface1, Surface2), 245 believe(Agent, Belief), 246 Time). 247 248% examples/Mueller2006/Chapter11/HungryCat.e:110 249% 250% 251% examples/Mueller2006/Chapter11/HungryCat.e:112 252% [agent,surface1,surface2,belief,time]% 253% HoldsAt(Believe(agent,BOn(agent,surface1)),time) & 254% HoldsAt(Believe(agent,BCanJump(surface1,surface2)),time) & 255% (belief = BOn(agent,surface1)) -> 256% Terminates(Jump(agent,surface1,surface2), 257% Believe(agent,belief), 258% time). 259holds_at(believe(Agent, bOn(Agent, Surface1)), Time), holds_at(believe(Agent, bCanJump(Surface1, Surface2)), Time), Belief=bOn(Agent, Surface1) -> 260 terminates(jump(Agent, Surface1, Surface2), 261 believe(Agent, Belief), 262 Time). 263 264% examples/Mueller2006/Chapter11/HungryCat.e:118 265% 266% 267% examples/Mueller2006/Chapter11/HungryCat.e:120 268% [agent,surface1,surface2,surface3,belief,time]% 269% (belief = BCanJump(surface1,surface3)) -> 270% Initiates(Move(surface1,surface2,surface3), 271% Believe(agent,belief), 272% time). 273Belief=bCanJump(Surface1, Surface3) -> 274 initiates(move(Surface1, Surface2, Surface3), 275 believe(Agent, Belief), 276 Time). 277 278% 279% 280% examples/Mueller2006/Chapter11/HungryCat.e:126 281% [agent,surface1,surface2,surface3,belief,time]% 282% (belief = BCanJump(surface1,surface2)) -> 283% Terminates(Move(surface1,surface2,surface3), 284% Believe(agent,belief), 285% time). 286Belief=bCanJump(Surface1, Surface2) -> 287 terminates(move(Surface1, Surface2, Surface3), 288 believe(Agent, Belief), 289 Time). 290 291% 292% 293% examples/Mueller2006/Chapter11/HungryCat.e:132 294% [agent,food,surface,belief,time]% 295% HoldsAt(Believe(agent,BOn(agent,surface)),time) & 296% HoldsAt(Believe(agent,BOn(food,surface)),time) & 297% (belief = BSatiated(agent)) -> 298% Initiates(Eat(agent,food),Believe(agent,belief),time). 299holds_at(believe(Agent, bOn(Agent, Surface)), Time), holds_at(believe(Agent, bOn(Food, Surface)), Time), Belief=bSatiated(Agent) -> 300 initiates(eat(Agent, Food), 301 believe(Agent, Belief), 302 Time). 303 304% 305% 306% examples/Mueller2006/Chapter11/HungryCat.e:138 307% [agent,food,surface,belief,time]% 308% HoldsAt(Believe(agent,BOn(agent,surface)),time) & 309% HoldsAt(Believe(agent,BOn(food,surface)),time) & 310% (belief = BOn(food,surface)) -> 311% Terminates(Eat(agent,food),Believe(agent,belief),time). 312holds_at(believe(Agent, bOn(Agent, Surface)), Time), holds_at(believe(Agent, bOn(Food, Surface)), Time), Belief=bOn(Food, Surface) -> 313 terminates(eat(Agent, Food), 314 believe(Agent, Belief), 315 Time). 316 317% 318% 319% ; Delta 320% examples/Mueller2006/Chapter11/HungryCat.e:145 321% 322% ; A7 323% examples/Mueller2006/Chapter11/HungryCat.e:147 324% [agent,belief,plan,time]% 325% HoldsAt(Goal(agent,belief),time) & 326% !HoldsAt(Believe(agent,belief),time) & 327% SelectedPlan(agent,belief,plan,time) & 328% (!{plan1} HoldsAt(Plan(agent,belief,plan1),time)) -> 329% Happens(AddPlan(agent,belief,plan),time). 330holds_at(goal(Agent, Belief), Time), not(holds_at(believe(Agent, Belief), Time)), selectedPlan(Agent, Belief, Plan, Time), not(exists([Plan1], holds_at(plan(Agent, Belief, Plan1), Time))) -> 331 happens(addPlan(Agent, Belief, Plan), Time). 332 333% 334% examples/Mueller2006/Chapter11/HungryCat.e:153 335% 336% ; A8 337% examples/Mueller2006/Chapter11/HungryCat.e:155 338% [agent,belief,time]% 339% HoldsAt(Plan(agent,belief,P1),time) & 340% !HoldsAt(Believe(agent,belief),time) & 341% SoundPlan(agent,belief,P1,time) -> 342% Happens(Jump(Cat,Floor,Chair),time). 343holds_at(plan(Agent, Belief, p1), Time), not(holds_at(believe(Agent, Belief), Time)), soundPlan(Agent, Belief, p1, Time) -> 344 happens(jump(cat, floor, chair), Time). 345 346% 347% 348% examples/Mueller2006/Chapter11/HungryCat.e:161 349% [agent,belief,time]% 350% HoldsAt(Plan(agent,belief,P1a),time) & 351% !HoldsAt(Believe(agent,belief),time) & 352% SoundPlan(agent,belief,P1a,time) -> 353% Happens(Wait(Cat),time). 354holds_at(plan(Agent, Belief, p1a), Time), not(holds_at(believe(Agent, Belief), Time)), soundPlan(Agent, Belief, p1a, Time) -> 355 happens(wait(cat), Time). 356 357% 358% 359% examples/Mueller2006/Chapter11/HungryCat.e:167 360% [agent,belief,time]% 361% HoldsAt(Plan(agent,belief,P2),time) & 362% !HoldsAt(Believe(agent,belief),time) & 363% SoundPlan(agent,belief,P2,time) -> 364% Happens(Jump(Cat,Chair,Shelf),time). 365holds_at(plan(Agent, Belief, p2), Time), not(holds_at(believe(Agent, Belief), Time)), soundPlan(Agent, Belief, p2, Time) -> 366 happens(jump(cat, chair, shelf), Time). 367 368% 369% 370% ; A9 371% examples/Mueller2006/Chapter11/HungryCat.e:174 372% [agent,belief,plan,time]% 373% HoldsAt(Plan(agent,belief,plan),time) -> 374% Happens(DropPlan(agent,belief,plan),time). 375holds_at(plan(Agent, Belief, Plan), Time) -> 376 happens(dropPlan(Agent, Belief, Plan), Time). 377 378% 379% 380% ; A10 381% examples/Mueller2006/Chapter11/HungryCat.e:179 382% [agent,belief,time]% 383% HoldsAt(Plan(agent,belief,P1),time) & 384% !HoldsAt(Believe(agent,belief),time) & 385% SoundPlan(agent,belief,P1,time) -> 386% Happens(AddPlan(agent,belief,P1a),time). 387holds_at(plan(Agent, Belief, p1), Time), not(holds_at(believe(Agent, Belief), Time)), soundPlan(Agent, Belief, p1, Time) -> 388 happens(addPlan(Agent, Belief, p1a), Time). 389 390% 391% 392% examples/Mueller2006/Chapter11/HungryCat.e:185 393% [agent,belief,time]% 394% HoldsAt(Plan(agent,belief,P1a),time) & 395% !HoldsAt(Believe(agent,belief),time) & 396% SoundPlan(agent,belief,P1a,time) -> 397% Happens(AddPlan(agent,belief,P1b),time). 398holds_at(plan(Agent, Belief, p1a), Time), not(holds_at(believe(Agent, Belief), Time)), soundPlan(Agent, Belief, p1a, Time) -> 399 happens(addPlan(Agent, Belief, p1b), Time). 400 401% 402% 403% examples/Mueller2006/Chapter11/HungryCat.e:191 404% [agent,belief,time]% 405% HoldsAt(Plan(agent,belief,P2),time) & 406% !HoldsAt(Believe(agent,belief),time) & 407% SoundPlan(agent,belief,P2,time) -> 408% Happens(AddPlan(agent,belief,P2a),time). 409holds_at(plan(Agent, Belief, p2), Time), not(holds_at(believe(Agent, Belief), Time)), soundPlan(Agent, Belief, p2, Time) -> 410 happens(addPlan(Agent, Belief, p2a), Time). 411 412% 413% 414% ; reactive behavior 415% examples/Mueller2006/Chapter11/HungryCat.e:198 416% [agent,food,surface,time]% 417% !HoldsAt(Satiated(agent),time) & 418% HoldsAt(On(agent,surface),time) & 419% HoldsAt(On(food,surface),time) -> 420% Happens(Eat(agent,food),time). 421not(holds_at(satiated(Agent), Time)), holds_at(on(Agent, Surface), Time), holds_at(on(Food, Surface), Time) -> 422 happens(eat(Agent, Food), Time). 423 424% 425% 426% ; narrative 427% examples/Mueller2006/Chapter11/HungryCat.e:205 428% 429% Happens(Move(Chair,Table,Shelf),2). 430happens(move(chair, table, shelf), 2). 431 432% 433% 434% ; SelectedPlan - plan library 435% 436% ;[agent,belief,plan,time] 437% ;SelectedPlan(agent,belief,plan,time) <-> 438% ;(agent=Cat & belief=BSatiated(Cat) & plan=P1 & time=0) | 439% ;(agent=Cat & belief=BSatiated(Cat) & plan=P2 & time=4). 440% examples/Mueller2006/Chapter11/HungryCat.e:214 441% 442% examples/Mueller2006/Chapter11/HungryCat.e:215 443% [agent,belief,plan,time]% 444% SelectedPlan(agent,belief,plan,time) <-> 445% ({surface1,surface2,surface3,food} 446% HoldsAt(Believe(agent,BOn(agent,surface1)),time) & 447% HoldsAt(Believe(agent,BCanJump(surface1,surface2)),time) & 448% HoldsAt(Believe(agent,BCanJump(surface2,surface3)),time) & 449% HoldsAt(Believe(agent,BOn(food,surface3)),time) & 450% belief=BSatiated(agent) & 451% plan=P1 & 452% time=0) | 453% ({surface1,surface2,surface3,food} 454% HoldsAt(Believe(agent,BOn(agent,surface1)),time) & 455% HoldsAt(Believe(agent,BCanJump(surface1,surface2)),time) & 456% HoldsAt(Believe(agent,BCanJump(surface2,surface3)),time) & 457% HoldsAt(Believe(agent,BOn(food,surface3)),time) & 458% belief=BSatiated(agent) & 459% plan=P2 & 460% time=4). 461selectedPlan(Agent, Belief, Plan, Time) <-> 462 ( exists([Surface1, Surface2, Surface3, Food], 463 (holds_at(believe(Agent, bOn(Agent, Surface1)), Time), holds_at(believe(Agent, bCanJump(Surface1, Surface2)), Time), holds_at(believe(Agent, bCanJump(Surface2, Surface3)), Time), holds_at(believe(Agent, bOn(Food, Surface3)), Time), Belief=bSatiated(Agent), Plan=p1, Time=0)) 464 ; exists( 465 [ Surface18, 466 Surface29, 467 Surface310, 468 Food11 469 ], 470 (holds_at(believe(Agent, bOn(Agent, Surface18)), Time), holds_at(believe(Agent, bCanJump(Surface18, Surface29)), Time), holds_at(believe(Agent, bCanJump(Surface29, Surface310)), Time), holds_at(believe(Agent, bOn(Food11, Surface310)), Time), Belief=bSatiated(Agent), Plan=p2, Time=4)) 471 ). 472 473% examples/Mueller2006/Chapter11/HungryCat.e:232 474% 475% 476% 477% ; SoundPlan 478% 479% examples/Mueller2006/Chapter11/HungryCat.e:237 480% [agent,belief,plan,time]% 481% SoundPlan(agent,belief,plan,time) <-> 482% (plan=P1 -> 483% HoldsAt(Believe(agent,BCanJump(Floor,Chair)),time) & 484% HoldsAt(Believe(agent,BCanJump(Chair,Table)),time)) & 485% ((plan=P1a | plan=P1b) -> 486% HoldsAt(Believe(agent,BCanJump(Chair,Table)),time)). 487soundPlan(Agent, Belief, Plan, Time) <-> 488 ( Plan=p1->holds_at(believe(Agent, bCanJump(floor, chair)), Time), holds_at(believe(Agent, bCanJump(chair, table)), Time) 489 ), 490 ( Plan=p1a;Plan=p1b->holds_at(believe(Agent, bCanJump(chair, table)), Time) 491 ). 492 493% examples/Mueller2006/Chapter11/HungryCat.e:243 494% 495% 496% ; Gamma 497% 498% examples/Mueller2006/Chapter11/HungryCat.e:247 499% [agent,belief]% 500% HoldsAt(Goal(agent,belief),0) <-> 501% (agent=Cat & belief=BSatiated(Cat)). 502holds_at(goal(Agent, Belief), 0) <-> 503 Agent=cat, 504 Belief=bSatiated(cat). 505 506% 507% 508% examples/Mueller2006/Chapter11/HungryCat.e:251 509% [agent,belief,plan] % !HoldsAt(Plan(agent,belief,plan),0). 510not(holds_at(plan(Agent, Belief, Plan), 0)). 511 512% 513% 514% examples/Mueller2006/Chapter11/HungryCat.e:253 515% [object,surface] % HoldsAt(On(object,surface),0) <-> 516% (object=Cat & surface=Floor) | 517% (object=Food1 & surface=Table) | 518% (object=Food2 & surface=Shelf). 519holds_at(on(Object, Surface), 0) <-> 520 ( Object=cat, 521 Surface=floor 522 ; Object=food1, 523 Surface=table 524 ; Object=food2, 525 Surface=shelf 526 ). 527 528% 529% 530% examples/Mueller2006/Chapter11/HungryCat.e:258 531% [surface1,surface2] % HoldsAt(CanJump(surface1,surface2),0) <-> 532% (surface1=Floor & surface2=Chair) | 533% (surface1=Chair & surface2=Table) | 534% (surface1=Shelf & surface2=Table). 535holds_at(canJump(Surface1, Surface2), 0) <-> 536 ( Surface1=floor, 537 Surface2=chair 538 ; Surface1=chair, 539 Surface2=table 540 ; Surface1=shelf, 541 Surface2=table 542 ). 543 544% 545% 546% examples/Mueller2006/Chapter11/HungryCat.e:263 547% [agent,object,surface]% 548% HoldsAt(Believe(agent,BOn(object,surface)),0) <-> 549% (agent=Cat & object=Cat & surface=Floor) | 550% (agent=Cat & object=Food1 & surface=Table). 551holds_at(believe(Agent, bOn(Object, Surface)), 0) <-> 552 ( Agent=cat, 553 Object=cat, 554 Surface=floor 555 ; Agent=cat, 556 Object=food1, 557 Surface=table 558 ). 559 560% 561% 562% examples/Mueller2006/Chapter11/HungryCat.e:268 563% [agent,surface1,surface2]% 564% HoldsAt(Believe(agent,BCanJump(surface1,surface2)),0) <-> 565% (agent=Cat & surface1=Floor & surface2=Chair) | 566% (agent=Cat & surface1=Chair & surface2=Table) | 567% (agent=Cat & surface1=Shelf & surface2=Table). 568holds_at(believe(Agent, bCanJump(Surface1, Surface2)), 0) <-> 569 ( Agent=cat, 570 Surface1=floor, 571 Surface2=chair 572 ; Agent=cat, 573 Surface1=chair, 574 Surface2=table 575 ; Agent=cat, 576 Surface1=shelf, 577 Surface2=table 578 ). 579 580% 581% 582% examples/Mueller2006/Chapter11/HungryCat.e:274 583% !HoldsAt(Believe(Cat,BSatiated(Cat)),0). 584not(holds_at(believe(cat, bSatiated(cat)), 0)). 585 586% 587% 588% ; ADDED: 589% !HoldsAt(Satiated(Cat),0). 590not(holds_at(satiated(cat), 0)). 591 592% 593% 594% completion Happens 595completion(happens). 596 597% examples/Mueller2006/Chapter11/HungryCat.e:280 598% 599% range time 0 7 600range(time, 0, 7). 601 602% range offset 1 1 603range(offset, 1, 1). 604 605% 606% ; End of file. 607% examples/Mueller2006/Chapter11/HungryCat.e:285 608% translate: ending File: examples/Mueller2006/Chapter11/HungryCat.e.pro