PROLOG结果vs true

PROLOG结果vs true,prolog,prolog-toplevel,Prolog,Prolog Toplevel,我有一个名为“testing.pl”的文件中的下一个代码: 然后,在SWI Prolog解释器中,我查询funcA(X)。,输出为: X = 1 ; X = 2 ; X = 3. true ; true ; true. 但是,每当我查询测试时,输出是: X = 1 ; X = 2 ; X = 3. true ; true ; true. 因此,我的问题是: 我如何使用一条规则的结论作为另一条规则的前提(funcA(X)(位于testing)右侧),但其效果与我查询该前提(funcA(X)

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

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

X = 1 ;
X = 2 ;
X = 3.
true ;
true ;
true.
但是,每当我查询
测试时,
输出是:

X = 1 ;
X = 2 ;
X = 3.
true ;
true ;
true.
因此,我的问题是:

我如何使用一条规则的结论作为另一条规则的前提(
funcA(X)
(位于
testing
)右侧),但其效果与我查询该前提(
funcA(X)
)的效果相同

在上面的示例中,我想在“testing.pl”文件的某个点编写
testing.
,并让funcA(X)执行与我使用解释器查询时相同的操作,因此funcB(X)将检查X可以从事实(N)中获取的所有值并返回它

我期望的结果是编写
测试。
并进入屏幕:

X = 1 ;
X = 2 ;
X = 3.
谢谢。

您可以在终端上手动打印任何内容,例如使用诸如
描绘子句/1
格式/2
等谓词

您需要的唯一附加功能是强制回溯所有答案的方法。一种方法是

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

testing :- funcA(X), format("X = ~q ;~n", [X]), false. 此外,谓词现在会失败,因此如果以交互方式(从顶层)使用它,也会得到
false/0
,但如果通过
swipl-g testing…
从shell调用
testing

还可以查看可用于使用预期变量名称的重要
变量名称/1
选项


作为练习,我可以根据您的具体用例定制此输出。理想情况下,输出应该是一个适当的序言项,这样您就可以通过使用
read/1
读取并将其与参考结果进行比较来轻松地测试它。

如果您想
测试。
要得到
X=1,
则需要将
X
作为
测试的参数。所以,
测试(X):-funcA(X)。
(这似乎没有增加任何用途)。或者,您也可以编写结果:
测试:-funcA(X),write('X='),write(X),nl。
回答得很好,但我提出的问题只是我真实代码的抽象,不幸的是,它是交互式的(在一个菜单循环中)。所以它被困在了错误的地方。不管怎样,这就是我所问的问题的答案,非常感谢。不客气。让我也谈谈您的实际代码:一个干净的方法是首先将杂质(即输入/输出)从实际的程序逻辑中分离出来。例如,要以纯粹的方式表示菜单,请使用类似于
menu0\u key\u menu/3
的谓词,将菜单的一个状态与菜单的新状态关联起来,具体取决于按下的
键。通过这种方式,您可以通过推理这个纯关系来测试菜单的行为,“模拟”实际按键,只需在目标中提供它们,如
menu0\u key\u menu(M0,q,exit)。
,这应该会成功(例如)。