这可能是一个完全天真的问题,但我有兴趣知道特定的原因。为什么PDDL首先开发?为什么我们不能使用First Order Logic进行推理?当我们已经有一阶逻辑时,为什么我们需要PDDL?
回答
效率解决
用更具体的语言来表达您的问题能够更明确的算法来解决这些问题。
从理论角度来看,FOL是不可判定的,而大多数PDDL仍然是可判定的,因为PDDL只能表达规划问题。并且例如具有参数化操作的经典计划与EXPSPACE-complete一样是“仅”。
当然,EXPSPACE完整的问题在更普遍/表达的FOL中表达,如果您知道,则可以在EXPSPACE中解决,。但是想出一个通用的FOL求解器有多难?它能保证只用指数空间来解决EXPSPACE中的所有问题?
效率建模
在实际方面,表达使用设计的造型规划问题,语言规划问题比FOL把它写下来更为方便。
难道你不想写C++而不是汇编语言?尽管你可以用C++编写的所有东西都可以用汇编语言表达。
只是为了正确:在其“典型形式”(即“具有参数化行为的经典计划”)中不是EXPTIME完整的,而是EXPSPACE完整的。但是,如果没有负面的先决条件和负面影响,它会变成EXPTIME完整的(参见Erol等人,1995年的文章“复杂性,决定性和不可计算性结果)”。 –
ziggystar没有明确提到的另一点是 - 除了使用PDDL比FOL更方便这一事实 - 即规划问题与FOL完全不同的语义。
虽然汇编和C++都用于描述计算机程序(用汇编为比C更一般++因为后者被转换成汇编语言),FOL用于完全不同的目的比PDDL(而FOL,如ziggystar指出,比PDDL更普遍)。 “所有人都可以思考”。FOL旨在表达对象之间的陈述,主张和关系,例如引用ziggystar的例子,来自类似问题Reason for the development of First Order Logic and PDDL。通常,在使用FOL时,我们只关心一个公式是否成立(或者,例如,是否有另一个提议)。最显着的例子是以下一组命题(在FOL中正式确定):(1)“所有人都是凡人。” (2)“苏格拉底是男人。”当使用FOL对此进行形式化时,我们可以问“(1)和(2)”是否(3)“苏格拉底是致命的”。任何完整的FOL推理者都会回答这个问题。
规划(因此依赖于PDDL描述的问题)是关于询问是否存在变换初始状态的一系列动作(即,实例化的PDDL操作符模式)的问题(对事件的先前执行的描述)到一些理想的目标状态。因此,计划是关于行为的执行和推理是否存在这样一个序列。这基本上与FOL无关。由于FOL比大多数标准规划形式(例如,“PDDL的风味”)更具表现力,因此也可以使用FOL来描述规划问题。然而,由于计划和FOL语义的完全不同,人们不得不“滥用”FOL来表达计划问题 - 实际上,这是一个复杂的研究问题,人们可以这样做。如果你有兴趣:谷歌“计划为SAT”。
- 1. 当我们已经有mapDispatchToProps时,为什么我们需要使用redux-thunk
- 2. 当我们已经有向量时,为什么我们需要同步ArrayList?
- 3. 为什么Haskell需要Data.Sequence当我们已经有了列表?
- 4. 为什么我们已经有CSS时需要ASP.NET主题?
- 5. 当我们有点子时,为什么我们需要Anaconda?
- 6. 我们已经有了nodejs,为什么我们需要nginx或apache?
- 7. 为什么我们需要Maven或Ant,如果我们已经有Eclipse?
- 8. 如果我们已经有[HttpPost],为什么需要使用JsonRequestBehavior?
- 9. 为什么我们需要analysis_export当我们有analysis_port
- 10. 封装 - 当setter已经公开时,为什么我们需要它?
- 11. 当HTTP代理已经缓存内容时,为什么我们需要CDN?
- 12. 为什么我们有逻辑内存时需要虚拟内存?
- 13. 当我们有内核时,为什么我们需要驱动程序?
- 14. 当我们有.java文件可用时,为什么我们需要JSP文件?
- 15. 为什么我们需要设备驱动程序,当我们已经有BIOS服务
- 16. 为什么我们需要时代?
- 17. 为什么我们需要Apache Harmony项目,而已经有一个OpenJDK项目
- 18. 为什么我需要=(class)...当我已经宣布课程时?
- 19. 虽然我们有Swing,但为什么我们需要JavaFX?
- 20. 当我们可以抛出TypeErrors时,为什么我们需要NaN值?
- 21. DavLockDB:我们需要什么?
- 22. 为什么我们在java中需要switch-case语句,如果我们已经有if-else if-else语句
- 23. 什么是仿函数,为什么我们需要它们?
- 24. 什么是EJB回调,为什么我们需要它们?
- 25. 装配需要什么?为什么我们使用它们?
- 26. 当pread接受偏移值时,为什么我们需要lseek?
- 27. 为什么我们需要simple_one_for_one?
- 28. 为什么我们需要TensorFlow tf.Graph?
- 29. 为什么我们需要使用prompt.start()?
- 30. 为什么我们需要scalaz.stream迭代?
[原因的一阶逻辑和PDDL的发展(可能重复http://stackoverflow.com/questions/7426384/reason-for-the-development-of-first-order-logic-and-pddl ) – geoffspear