prolog - 前言:失败驱动循环

标签 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中处理此问题,因为回溯似乎是隐式的。

最佳答案

没错,回溯是Prolog处理替代方案的方式。

使用findall / 3,它使用“内部”回溯来收集所有替代项:

someGoal(X, Values) :-
    findall(Value, happiness(X, Value), Values).


然后?- someGoal(_, Values).将实例值= [5、3、2]

关于prolog - 前言:失败驱动循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13057428/

相关文章:

prolog - 如何使用成员谓词在序言中指定约束

variables - 正确使用 findall/3,特别是最后一个结果参数

prolog - 带有复合谓词的 setof

prolog - 检查 List 中是否有任何元素以特定字符开头

prolog - 如何编写序言数学函数?

database - Prolog - 如何区分字符串和变量?

scala - 使用 "Prolog in Scala"查找可用的类型类实例

prolog - 找到满足某些条件的 16 位数字的最优雅的方法是什么?

prolog - 如何实现完全声明式的 Horn 逻辑?

list - setof 创建多个列表而不是一个列表 prolog