Prolog:获得谓词解决方案并将其断言为事实

ale*_*ale 3 prolog

我有一个特定的问题,但我将尝试提出一个一般性问题,以便其他人也可以从中受益...

我有一个谓词,它返回许多解决方案,即

X=5; X=2; X=7

我想要一个谓词来获取每个解决方案并将它们断言为Prolog事实,因此在这种情况下,我得出了三个事实,例如

fact(5) fact(2) fact(7)

因此调用fact(5)将是正确的,但调用fact(8)将是错误的,因为我们从来没有断言它是因为它不是解决方案。

但是我不想有一个谓词,您必须继续寻求解决方案来断言每个事实。我想调用一个谓词,并使其在后台经历所有解决方案,然后断言它们,仅此而已。

解决该问题的一种方法是使用findall将所有解决方案放入列表中,然后遍历该列表以声明列表中的每个元素。但是,我认为这不是很优雅。必须有一种更好的方法来做到这一点,而又不用摆弄列表。

mat*_*mat 5

使用故障驱动的循环来强制回溯所有解决方案:

?- computation(X), false.
Run Code Online (Sandbox Code Playgroud)

您可以使用ignore / 1忽略此查询的声明性虚假真值:

?- ignore((computation(X),false)).
Run Code Online (Sandbox Code Playgroud)