prolog - Prolog 中的 CHR 解输出

标签 prolog swi-prolog constraint-handling-rules

我正在 SWI-Prolog 中运行教科书 CHR 程序。

:- use_module(library(chr)).
:- chr_constraint fib/2.

f0 @ fib(0,M) ==> M=1.
f1 @ fib(1,M) ==> M=1.
fn @ fib(N,M) ==> N>=2 | N1 is N-1, fib(N1,M1), N2 is N-2, fib(N2,M2), M is M1+M2.

一切顺利,但我不明白为什么输出这么长

?- fib(3,A).
A = 3,
fib(1, 1),
fib(0, 1),
fib(1, 1),
fib(2, 2),
fib(3, 3).

谁不只有 A = 3?我可以禁用其余部分吗?对于更大的值来说这确实是一个不便......

最佳答案

必须在源代码中寻找解决方案,但您可以通过将标志设置为 false 将其关闭:

?- set_prolog_flag(chr_toplevel_show_store, false).
true.
?- fib(3, A).
A = 3.

.swiplrc 中设置标志不起作用,需要在导入模块后完成,因此您可以将其包含在源代码中:

:- use_module(library(chr)).
:- set_prolog_flag(chr_toplevel_show_store, false).

:- chr_constraint fib/2.

f0 @ fib(0,M) ==> M=1.
f1 @ fib(1,M) ==> M=1.
fn @ fib(N,M) ==> N>=2 | N1 is N-1, fib(N1,M1), N2 is N-2, fib(N2,M2), M is M1+M2.

关于prolog - Prolog 中的 CHR 解输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57349596/

相关文章:

java - 让 SWI-Prolog 的 JPL 接口(interface)工作

prolog - 避免 Prolog 中的数据冗余

performance - Prolog 的 CLP over Finite Domains 库性能

prolog - SWI Prolog : Does the "constraint store" exists only for the duration of the toplevel goal processing? 中的约束处理规则

prolog - 为什么列表 [1] 没有包含在答案 P = [[]] 中?序言

Emacs 和 Prolog

prolog - 定子句语法,如何检查字符串是否为字符?

prolog - 从 reply_html_page 中删除元数据

prolog - 解决序言中的链式 react