PROLOG结果vs true

时间:2017-04-13 12:14:00

标签: prolog prolog-toplevel

我在名为" 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),但具有与查询该前提相同的效果({{1 }})?

在上面的示例中,我想在我的" testing.pl"的某些时刻写funcA(X)。文件并让funcA(X)做同样的事情,就像我用解释器查询一样,所以funcB(X)将检查X可以从事实(N)获取的所有值并返回它。

我希望的结果是写testing.并进入屏幕:

testing.

感谢。

1 个答案:

答案 0 :(得分: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,但如果您调用,则 来自shell的testing来自swipl -g testing ...

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

我将此输出定制为您的确切用例作为练习。理想情况下,输出应该是正确的 Prolog术语,以便您可以通过使用read/1读取它并将其与参考结果进行比较来轻松地测试它。