0

我正在尝试打印用于获取查询解决方案的所有事实,如果统一失败,我希望不打印任何内容。所以我写这个:

a:-
    b,c,writeln(b^c->a).
b:-
    d,writeln(d->b).
c:-
    fail,writeln(e->c).
d:-
    writeln(d).
a:-
    b,d,writeln(b^d->a).

但是,当我查询时a.,我很遗憾地得到了以下输出:

d
d->b
d
d->b
d
b^d->a
true.

似乎有人告诉我,Prolog 有一个内置机制来显示用于查询的所有事实。他是真的吗?我怎样才能得到正确的输出?

4

1 回答 1

1

您的程序没有变量,因此没有统一性。

编辑:或者更好,在抽象意义上,Prolog在将当前目标与每个规则头统一的 Horn 子句列表之间进行选择。但是实际的 Prologs 用索引代替了选择阶段,以提高性能,并尝试统一参数。

当您调用a时,它会调用b and c 打印一个表达式。

显示查询中使用的所有规则的内置机制可能是trace。有关详细信息,请参阅您的 Prolog 手册,这是一个相当复杂的论点,涉及系统的内部工作以及您所针对的语言的“架构”。

当然没有正确的输出,除了你能看到的。这就是你写的语义。

于 2012-04-14T05:15:25.353 回答