0

我需要将数据库中的所有术语统一为一个变量。

对于给定的代码:

man('a').
man('b').

main :-
        prompt(_, ''),
        man(X),
        write(X),
        nl,
        halt.

我得到输出:

a

我需要得到类似的东西:

['a','b']

是否可以?我知道retract/1,它从数据库中删除了术语,我可以遍历所有这些事实并将它们从数据库中一个一个地收回,但这似乎是在腿上开枪。任何给定的建议都值得赞赏。

4

1 回答 1

3

如果您有一系列事实,例如:

man(a).
man(b).

正如评论中所述,您可以通过以下方式找到所有解决方案findall

| ?- findall(X, man(X), Solutions).
Solutions = [a, b]

您还可以修改原始程序以使用故障驱动循环。fail在 Prolog 中就是这样做的:它失败了,所以它导致 Prolog 回溯。一旦man(X)无法找到更多解决方案,那么mainProlog 的第一个子句最终将失败到第二个子句,第二个子句将简单地成功,无需进一步操作:

main :-
    man(X),
    write(X),
    nl,
    fail.
main.

现在,如果您查询main,您会得到:

| ?- main.
a
b

yes
| ?-

在更广泛的程序的上下文中,findall/3可能是首选,因为它为您捕获解决方案,而上述只是“打印”出来而不收集它们。虽然,有时这就是我们想要的。

于 2019-04-23T10:20:15.130 回答