我试图理解Prolog中公理解析的工作原理。
假设我定义了两个自然数的基本运算:
- s(term)(代表后继)和 - add(term, anotherTerm)。
add的语义由以下规则给出:
- add(0, x1) -> x1 - add(x1, 0) -> x1 - add(s(x1), y1) -> s(add(x1, y1))
然后,我想要解决方程:
add(x, add(y, z)) = s(0)
我想象一种策略可能是:
- 检查等式的右手边(RHS)是否等于左手边(LHS) - 如果不相等,则尝试通过查找最通用的统一器来寻找解决方案 - 如果没有找到解决方案,则尝试查找可以在此等式中使用的公理。进行此操作的策略可能是(对于每个公理):尝试解决等式的RHS等于公理的RHS。如果有一个解决方案,则尝试解决等式的LHS等于公理的LHS。如果成功,则我们已经找到了正确的公理。 - 最后,如果没有解决方案并且等式的LHS和RHS是相同的操作(即具有相同的签名但不是相同的操作数),则对每个操作数应用算法,如果每个操作数都有解决方案,则找到解决方案。
我认为这种(简单的)算法可能有效。但是,我想知道是否有人有解决此类问题的经验?是否有人知道在哪里可以找到更好算法的文档?
提前感谢您的帮助。
假设我定义了两个自然数的基本运算:
- s(term)(代表后继)和 - add(term, anotherTerm)。
add的语义由以下规则给出:
- add(0, x1) -> x1 - add(x1, 0) -> x1 - add(s(x1), y1) -> s(add(x1, y1))
然后,我想要解决方程:
add(x, add(y, z)) = s(0)
我想象一种策略可能是:
- 检查等式的右手边(RHS)是否等于左手边(LHS) - 如果不相等,则尝试通过查找最通用的统一器来寻找解决方案 - 如果没有找到解决方案,则尝试查找可以在此等式中使用的公理。进行此操作的策略可能是(对于每个公理):尝试解决等式的RHS等于公理的RHS。如果有一个解决方案,则尝试解决等式的LHS等于公理的LHS。如果成功,则我们已经找到了正确的公理。 - 最后,如果没有解决方案并且等式的LHS和RHS是相同的操作(即具有相同的签名但不是相同的操作数),则对每个操作数应用算法,如果每个操作数都有解决方案,则找到解决方案。
我认为这种(简单的)算法可能有效。但是,我想知道是否有人有解决此类问题的经验?是否有人知道在哪里可以找到更好算法的文档?
提前感谢您的帮助。