Prolog对一个变量的多重统一
Prolog multiple unifications to one variable
我需要将数据库中的所有术语统一到一个变量中。
对于给定的代码:
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]
您还可以修改原始程序以使用故障驱动循环。 fail
在 Prolog 中就是这样做的:它失败了,因此它导致 Prolog 回溯。一旦 man(X)
找不到更多解决方案,那么 main
的第一个子句最终将使 Prolog 失败到第二个子句,第二个子句将成功而无需进一步操作:
main :-
man(X),
write(X),
nl,
fail.
main.
现在,如果您查询 main
,您将得到:
| ?- main.
a
b
yes
| ?-
在更广泛的程序的上下文中,findall/3
可能是首选,因为它为您捕获了解决方案,而上面只是 "prints" 解决方案而没有收集它们。虽然,有时候这就是所需要的。
我需要将数据库中的所有术语统一到一个变量中。
对于给定的代码:
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]
您还可以修改原始程序以使用故障驱动循环。 fail
在 Prolog 中就是这样做的:它失败了,因此它导致 Prolog 回溯。一旦 man(X)
找不到更多解决方案,那么 main
的第一个子句最终将使 Prolog 失败到第二个子句,第二个子句将成功而无需进一步操作:
main :-
man(X),
write(X),
nl,
fail.
main.
现在,如果您查询 main
,您将得到:
| ?- main.
a
b
yes
| ?-
在更广泛的程序的上下文中,findall/3
可能是首选,因为它为您捕获了解决方案,而上面只是 "prints" 解决方案而没有收集它们。虽然,有时候这就是所需要的。