我在名为" 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.
感谢。
答案 0 :(得分:3)
您可以手动在终端上打印任何内容,例如使用portray_clause/1
,format/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
读取它并将其与参考结果进行比较来轻松地测试它。