自从我认真使用Prolog以来已经很长时间了,但是我无法通过谷歌搜索或在我的文本中找到任何参考。这可能是术语的失败,所以如果我屠杀它就道歉。
如果我有一个可以有多个解决方案的程序:
likes(mary, joe).
likes(bob, joe).
:- likes(X, joe)
是否有一种简单的内置方法让求解器以随机顺序运行匹配谓词,因此以随机顺序给出结果(或者,等效地,让第一个解是随机的)?
显然,您可以使用 random 这个词来获得您想要的复杂程度。我正在考虑在求解器的每一步中从有效谓词集中进行一些均匀随机抽样。像有效解决方案上的统一随机抽样更复杂的东西也很好。问题很笼罩。
我可以构建一个程序来执行此操作,使用随机数生成器和元编程。但我想检查一下我是否遗漏了一些简单的东西。
答案 0 :(得分:2)
在这种情况下随机化解决方案是最简单的,因为你只有有限数量,因此可以轻松收集它们:
?- findall(X, likes(X, joe), Ps0), random_permutation(Ps0, Ps), member(P, Ps).
这样,所有人P
都会以随机顺序一个接一个地向joe
提供。
答案 1 :(得分:2)
匹配子句的线性选择是Prolog算法(或更好SLD resolution)的重要组成部分。每场比赛都是候选人解决方案。我想你不能指望Prolog这样随机化你的条款。
我会详细说明垫'答案:
:- meta_predicate randomize_preds(0).
randomize_preds(C) :-
findall(C, retract(C), Cs),
random_permutation(Cs, Rs),
maplist(assertz, Rs).
:- dynamic likes/2.
likes(alice, joe).
likes(bob, joe).
likes(charlie, joe).
likes(dan, joe).
试验:
3 ?- randomize_preds(likes(_,_)),findall(X,likes(X,joe),L).
L = [bob, alice, charlie, dan].
4 ?- randomize_preds(likes(_,_)),findall(X,likes(X,joe),L).
L = [alice, bob, dan, charlie].