知识卡片
Prolog 与逻辑编程:靠消解和合一求解
内容
逻辑程序设计语言(如 Prolog)是说明性范型的代表:程序员不写解决问题的步骤,只写一组描述已知事实(如”乌龟比蜗牛快”)和一般规则(如”若 X 比 Y 快、Y 比 Z 快,则 X 比 Z 快”)的语句,剩下的推理交给内置的通用算法完成。这个通用算法基于消解——一种从”P 或 Q”和”R 或非 Q”这类语句机械地推导出”P 或 R”的演绎规则,只要反复消解能推出一个空子句,就证明了最初那组语句本身自相矛盾;把目标语句的否定加入这组语句、再看能不能推出空子句,就等价于证明了原本那组语句蕴涵着这个目标。当规则中出现像”X”这样的变量时,消解过程会顺带记录下让语句匹配所需的具体赋值(如把 X 绑定为 home),这个过程称为合一,它让一般性规则能落地到具体实例上。发散:Prolog 的理想很美——程序员只管陈述事实和规则,问答交给机器;但现实中消解可选择的路径太多,纯理论上的通用消解算法效率低下,实际的 Prolog 程序往往还是要加入额外语句去引导消解顺序,这提醒我们”声明式”的承诺(只说要什么,不管怎么做)在工程落地时常常需要向”过程式”的现实做出妥协。
参考来源
《计算机科学概论》第6章《程序设计语言》