2

我在一个名为“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.在我的“testing.pl”文件的某个位置编写并让 funcA(X) 像我使用解释器查询时一样执行相同的操作,因此 funcB(X) 将检查所有X 可以从 fact(N) 中获取并返回的值。

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

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

谢谢。

4

1 回答 1

3

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

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

因此,在您的情况下,您可以编写例如:

测试:-
        函数A(X),
        format("X = ~q ;~n", [X]),
        假的。

现在调用testing/0收益率,没有任何进一步的交互

?- 测试。
X = 1;
X = 2;
X = 3 ;

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

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

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

于 2017-04-13T12:58:28.873 回答