PROLOG 结果与真实

PROLOG result vs true

我在名为 "testing.pl" 的文件中有下一个代码:

fact(1).
fact(2).
fact(3).

funcA(X) :- funcB(X).

funcB(X) :- fact(X).

testing :- funcA(_X).

然后,在 SWI-Prolog 解释器中,我查询 funcA(X).,输出为:

X = 1 ;
X = 2 ;
X = 3.

但是,每当我查询 testing. 时,输出是:

true ;
true ;
true.

所以,我的问题是:

如何将一条规则的结论用作另一条规则的前提(funcA(X)testing 的右边),但效果与查询该前提相同(funcA(X))?

在上面的示例中,我想在我的 "testing.pl" 文件的某个位置写入 testing. 并让 funcA(X) 执行与我使用解释器查询时相同的操作,因此 funcB(X) 将检查 X 可以从 fact(N) 和 return 中获取的所有值。

我希望的结果是写 testing. 并出现在屏幕上:

X = 1 ;
X = 2 ;
X = 3.

谢谢。

您可以手动在终端上打印任何内容,例如使用portray_clause/1format/2等谓词

您唯一需要的额外部分是强制回溯所有答案的方法。一种方法是 using false/0.

因此,对于您的情况,您可以这样写:

testing :-
        funcA(X),
        format("X = ~q ;~n", [X]),
        false.

现在调用 testing/0 产量,无需任何进一步交互

?- testing.
X = 1 ;
X = 2 ;
X = 3 ;

此外,谓词现在 失败 ,因此如果您以交互方式(从顶层)使用它,您也会得到 false/0,但 不会 如果您通过 swipl -g testing ... 从 shell 调用 testing

另请查看可用于使用预期变量名称的重要 variable_names/1 选项。

我将根据您的具体用例定制此输出作为练习。理想情况下,输出应该是一个适当的 Prolog term,这样您实际上可以 test 通过阅读 read/1 并比较它它作为参考结果。