将一个变量的多个统一化

时间:2019-04-22 12:12:36

标签: prolog

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

对于给定的代码:

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

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

我得到输出:

a

我需要得到类似的东西:

['a','b']

有可能吗?我知道retract / 1,它从数据库中删除了该术语,我可以遍历所有这些事实,然后逐个从数据库中撤回它们,但这似乎就像在开枪。任何给定的建议都表示赞赏。

1 个答案:

答案 0 :(得分: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可能是首选,因为它可以为您捕获解决方案,而以上内容只是“打印”出它们而没有收集它们。虽然,有时候只有这些。