PROLOG结果vs true
我有一个名为“testing.pl”的文件中的下一个代码: 然后,在SWI Prolog解释器中,我查询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)
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)。
,这应该会成功(例如)。