一個 problem 是規劃問題的另一半。在這個領域中,我們表達問題的全局“ worldly”方面,比如我們可以執行哪些操作,以及我們計劃的世界中存在哪些類型的對象。
然後,通過準確定義對象的存在、它們的真實情況以及最終的目標是什麼,這個問題鞏固了這個表達式。一旦規劃完成,我們希望世界處於什麼樣的狀態。
先引入一個簡單的例子:
(define
(problem buildingahouse)
(:domain construction)
;(:situation <situation_name>) ;deprecated
(:objects
s1 - site
b - bricks
w - windows
c - cables
)
(:init
(on-site b s1)
(on-site c s1)
(on-site w s1)
)
(:goal (and
(walls-built ?s1)
(cables-installed ?s1)
(windows-fitted ?s1)
)
)
)
內容:
- Problem Name
- Domain
- Situation
- Objects
- Init(Initial State)
- Goal
1、Problem Name
(problem <name>)
每個問題都有一個名稱,通常這是唯一的標識符。它允許使用可以擴展問題的 situation 關鍵字。然而,雖然這個名稱通常包含在大多數問題中,但是利用情境來擴展問題並不常見。大多數問題名稱都缺乏想象力,比如 prob1 或 p1
(problem buildingahouse)
2、Domain
(:domain <domain_name>)
domain參數引用問題所在的域(有關域的詳細信息,請參閱域)。雖然經常在問題文件中定義,但是這個參數通常是多餘的,因爲大多數計劃人員從命令行獲取域和問題文件,並假設其中定義的域對應於另一箇中定義的問題。不過情況並不總是這樣,所以無論如何都值得指定域名
(:domain construction)
3、Situation
(:situation <parent_problem_name>)
situation 參數從另一個問題文件繼承 qualities 。在某些情況下,我們所有的問題都有一些共同的特性,我們可以將這些特性表示爲 situation 文件的一部分。例如,我們所有的問題都有兩個 site,一個貯藏庫和一個建築工地。因此,我們可以將其表示爲一種情況的一部分,然後在問題文件中只表示特定問題特有的方面。
situation的使用並不常見,大多數問題文件甚至會在每個文件中定義公共元素。它在一些新型的規劃器不支持,棄用。
(:situation generalbuildingproblem)
4、Objects
(:objects
object_name_1 ... object_name_n - some_object_type
...
object_name_1 ... object_name_n - some_object_type
)
對象塊允許我們聲明存在於我們的問題中的一組對象。每個對象名稱必須是惟一的,並且應該類型化。如果沒有類型化,則它們通常採用基類型 object 的屬性(有關詳細信息,請參閱 (Domain - Object Types)
(:objects
s1 s2 s3 - site
ba bb bc - bricks
windowAlpha windowBeta windowCharlie - windows
uierjiae faufhf uihrai - cables
)
請注意,雖然傳統上我們只使用一個縮寫後跟數字,但我們不需要這樣做,甚至可以使用一些毫無用處的名稱(如上所示)。
(:objects
s1 - site
b - bricks
w - windows
c - cables
)
5、Init
(:init
<predicate>
...
<predicate>
)
初始狀態(init)特別定義了在問題開始時哪些謂詞爲真。這不是一個邏輯表達式,因爲它只是一個爲真謂詞列表。除非規劃器或 domain 指定了其他方法,否則所有問題都應用了“ closed world”假設,即任何未指定爲真都被認爲是假的。因此,我們只需要列出真實的東西
(:init
(on-site b s1)
(on-site c s1)
(on-site w s1)
)
就我們的領域和問題而言,唯一True的事件是,我們需要構建的材料是 on-site。
6、Goal
(:goal logical_expression)
目標是謂詞的邏輯表達式,爲了將計劃視爲解決方案,必須滿足這些謂詞。本質上,這就是我們希望世界最終的樣子。注意,作爲邏輯表達式,如果這個表達式排除了某個謂詞,那麼該謂詞的值就不重要。 這意味着一個目標不僅應該有爲真的謂詞組成,而且還應該有爲假的謂詞組成。
注意,所有標準邏輯操作符(如 or 和 forall )都是目標的一部分,這意味着我們可以表示多個不同的目標狀態,所有這些狀態都是可接受的
(:goal (and
(walls-built ?s1)
(cables-installed ?s1)
(windows-fitted ?s1)
)
)
通常,大多數目標只是連接和否定,因爲在規劃的最後只有一個理想的狀態。
And(合取)
(and (predicate_1) ... (predicate_n))
謂詞的組合,表示所有值必須爲真,才能求值爲真。如。
(and (walls-built ?s) (windows-fitted ?s))
Or(析取)
(or (predicate_1) ... (predicate_n))
謂詞的分離,表示至少一個值必須爲真,才能求值爲真。如。
(or (windows-fitted ?s) (cables-installed ?s))
Imply(蘊含)
(imply (antecedent_predicate) (consequent_predicate))
An在前提謂詞和結果謂詞之間蘊含。當先行詞爲假,或先行詞和結果爲真時,An就意味着計算爲真。如
(imply (walls-built ?s) (foundations-set ?s))
Not(非)
(not (logical_expression/predicate_name))
Not否定謂詞值或邏輯表達式。在前置條件下,它表示某個謂詞值或邏輯表達式爲假。在效果上,它將false賦給謂詞值。
(not (material-used ?b))
Forall
(forall (argument) logical_expression)
forall接受一個參數,並表示某個邏輯表達式在參數值進入後依然爲真。在本例中, domain 中的所有bricks對象都沒有被使用
(forall (?b - bricks)
(not (material-used ?b))
)
When
(forall (argument)
when (inclusion_expression)
logical expression
)
when擴展一個forall條件以指定包含條件。本質上是說, forall檢查when中這些條件是否滿足。如。
(forall (?c - bricks)
when (on-site ?c ?s)
(material-used ?c)
)
表示 forall 的bricks滿足條件 on-site ?c ?s,它們還必須滿足已經使用過的條件 material-used ?c
Exists
(exists (argument) logical_expression)
exists 表達的意思與 forall相同,除了不是表示給定類型的每個對象都滿足一個邏輯表達式, 它表示至少有一個符合邏輯表達式就可以。
(exists
(?c - bricks)
(not (material-used ?c))
)
References
- PDDL - The Planning Domain Definition Language, [Ghallab, M. Howe, A. Knoblock, C. McDermott, D. Ram, A. Veloso, M. Weld, D. Wilkins, D.]
- OPTIC - Optimising Preferences and Time Dependent Costs
來自 <https://github.com/nergmada/pddl-reference/blob/master/docs/reference/PDDL/problem.md>