我有兴趣使用 Prolog 来找到最大化某些输出原子的解决方案。例如,有 10 个谓词:
solution(1).
solution(2).
solution(3).
solution(4).
solution(5).
solution(6).
使用 max 参数求解(通常的方法)将涉及谓词
findall
或 setof
。这种方法的问题是它使用大量 RAM。我感兴趣的是:
findmin(MinAtom, Solution, (predicate(MinAtom, Solution))).
这样,图搜索就不需要使用大量内存来存储所有执行路径,而是可以对每个执行路径进行排列,仅保留沿途运行的“最小”解决方案。有没有一种本地方法可以做到这一点? 我想了一种方法来“摇摆”这种行为,首先采取任意解决方案,然后找到一个效果更好的解决方案,然后继续这个过程,直到找不到“更好”的解决方案,此时程序停止。然而,当 Prolog 执行图搜索时,这种方法涉及一些执行重复。
有人对如何在 Prolog 中解决此类问题有任何见解吗?它与整数线性规划有些关系,但 ILP 是以图搜索的方式进行的。 我也愿意采用一些黑客方法,例如滥用
fail
谓词。
除非你的问题中有一个微妙的地方,我错过了:
除非你破坏它,否则它将在恒定内存中运行。请检查实现,这很有趣。它展示了如何使用 Prolog 作为更基本的编程语言之一。