Prolog:故障驱动循环
我使用下面的失败驱动循环列出所有内容,而不使用 分号Prolog:故障驱动循环,prolog,logic-programming,prolog-setof,Prolog,Logic Programming,Prolog Setof,我使用下面的失败驱动循环列出所有内容,而不使用 分号 happiness(fred,5). happiness(john,3). happiness(grace,2). someGoal(X) :- happiness(X,Y), write(Y), tab(4), fail. 在查询模式下,我得到了预期的结果 ?- someGoal(_). 5 3 2 如何将这些数字插入列表而不是写入屏幕? 我无法在someGoal中处理这个问题,因为回溯似乎是隐含的。你是
happiness(fred,5).
happiness(john,3).
happiness(grace,2).
someGoal(X) :-
happiness(X,Y), write(Y), tab(4), fail.
在查询模式下,我得到了预期的结果
?- someGoal(_).
5 3 2
如何将这些数字插入列表而不是写入屏幕?
我无法在
someGoal
中处理这个问题,因为回溯似乎是隐含的。你是对的,回溯是Prolog处理备选方案的方式
使用/3,使用回溯“内部”收集所有备选方案:
someGoal(X, Values) :-
findall(Value, happiness(X, Value), Values).
然后
?-someGoal(u,Values)。
将实例值=[5,3,2]故障驱动的循环通常会留下某些未指定的部分,这些部分迟早会导致一些问题。特别是变量的精确量化很容易保持开放状态。在您的示例中,我根本不清楚您为什么对someGoal/1
有一个参数。至少你不用它。因此出现了几个问题:
谢谢,太好了,救了我一天。我建立了大量的开场白技巧,但尝试了另一种方式:非常感谢您的进一步澄清和案例研究。为了便于阅读,我的玩具示例从一个更复杂的示例缩减为一个。 happiness(fred,5). happiness(john,3). happiness(john,3). happiness(grace,2). ?- setof(P-H,happiness(P,H), PHs). PHs = [fred-5, grace-2, john-3]. ?- setof(H,P^happiness(P,H), PHs). PHs = [2, 3, 5]. ?- bagof(H,P^happiness(P,H), PHs). PHs = [5, 3, 3, 2].