我需要将数据库中的所有术语统一为一个变量。
对于给定的代码:
man('a').
man('b').
main :-
prompt(_, ''),
man(X),
write(X),
nl,
halt.
我得到输出:
a
我需要得到类似的东西:
['a','b']
可能吗?我知道 retract/1,它从数据库中删除该术语,我可以遍历所有事实并将它们从数据库中一一撤回,但这似乎就像在腿上开枪一样。任何给定的建议都会受到赞赏。
如果您有一系列事实,例如:
man(a).
man(b).
如评论中所述,您可以使用以下findall
找到所有解决方案:
| ?- findall(X, man(X), Solutions).
Solutions = [a, b]
您还可以修改原始程序以使用故障驱动的循环。 Prolog中的fail
就是这样做的:它失败了,所以它导致Prolog回溯。一旦man(X)
未能找到更多的解决方案,那么main
的第一条最终将使Prolog失败到第二条,第二条将成功,无需进一步的行动:
main :-
man(X),
write(X),
nl,
fail.
main.
现在,如果您查询main
,您将获得:
| ?- main.
a
b
yes
| ?-
在更广泛的程序的上下文中,findall/3
可能是首选,因为它为您捕获解决方案,而上述内容只是"打印"它们而不收集它们。虽然,有时这就是所期望的。