Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog:故障驱动循环_Prolog_Logic Programming_Prolog Setof - Fatal编程技术网

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
有一个参数。至少你不用它。因此出现了几个问题:

  • 如果没有匹配值,您希望得到什么?您的原始程序没有打印任何内容,因此失败

  • 如果有多余的条目,您希望得到什么?你想把东西打印几次吗

  • 你是坚持价值的精确顺序,还是能想象另一种顺序

  • 你为什么对这些价值观感兴趣?大多数情况下,您要么希望看到它们与具体名称关联,要么希望看到它们的一些集合,如总和或平均值

  • 鉴于我不知道这些问题的答案,我可以为您提供几种解决方案。我将用一个额外的(多余的)事实来举你的例子:

    幸福(弗雷德,5岁)。 幸福(约翰,3)。 幸福(约翰,3)。 幸福(格蕾丝,2)。 ?设置(P-H,幸福(P,H),PHs)。 PHs=[fred-5,grace-2,john-3]。 ?设置(H,P^幸福(P,H),PHs)。 PHs=[2,3,5]。 -巴格夫(H,P^幸福(P,H),小灵通)。 PHs=[5,3,3,2]。
    谢谢,太好了,救了我一天。我建立了大量的开场白技巧,但尝试了另一种方式:非常感谢您的进一步澄清和案例研究。为了便于阅读,我的玩具示例从一个更复杂的示例缩减为一个。 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].