我正在尝试打印用于获取查询解决方案的所有事实,如果统一失败,我希望不打印任何内容。所以我写这个:
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有一个内置的机制来显示用于查询的所有事实。他是真的吗?我怎样才能得到正确的输出?
答案 0 :(得分:1)
你的程序没有变量,因此没有统一。
编辑:或者更好,在抽象意义上,Prolog 在统一当前目标的Horn子句列表之间选择 每个规则头。但实际的Prologs用索引替换了选择阶段,性能和尝试统一参数。
当您调用a
时,会调用b
和 c
,和 打印表达
显示查询中使用的所有规则的内置机制可能是trace。有关详细信息,请参阅Prolog手册,这是一个相当复杂的论点,涉及系统的内部工作原理以及您所针对的语言的“架构”。
除了你能看到的内容外,当然没有正确的输出。那是你写的语义。