PDDL語法學習-Problem篇-1

一個 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

6Goal

(: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

 

 

 

 

來自 <https://github.com/nergmada/pddl-reference/blob/master/docs/reference/PDDL/problem.md>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章