逻辑编程中的规划、元知识与操作定义
1. 规划(Planning)
规划在某些方面与模拟相反。模拟是从初始状态和一个计划(即一系列动作)开始,通过模拟来确定在初始状态下执行该计划的结果。而规划则是从初始状态和一个目标(即一组期望的状态)开始,通过规划来计算出一个能实现其中一个目标状态的计划。
我们使用一元谓词 goal
来定义期望的状态。例如,规则 goal(S) :- tr(on(a,b),S) & tr(on(b,c),S)
定义了如果在状态 S
中 on(a,b)
和 on(b,c)
都为真,那么该状态满足目标。
在推导结论时,理论上可以通过自底向上或自顶向下评估来实现。但自底向上评估会探索很多与目标无关的计划,而自顶向下评估虽然专注于目标,但可能会陷入无限循环。为解决这个问题,我们采用两者结合的方法,定义二元谓词 plan
:
plan(nil,S) :- goal(S)
plan(A!L,S) :- plan(L,do(A,S))
通过提出问题 plan(L,s1)
,自顶向下评估会尝试不同长度的计划,先尝试短计划,若无法实现目标再尝试更长的计划。这种方法比自底向上执行稍快,且能保证产生最短的可能计划,但仍然成本较高。
以下是规划过程的流程图:
graph TD;
A[开始]