PROLOG 结果与真实
PROLOG result vs true
我在名为 "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.pl" 文件的某个位置写入 testing.
并让 funcA(X) 执行与我使用解释器查询时相同的操作,因此 funcB(X) 将检查 X 可以从 fact(N) 和 return 中获取的所有值。
我希望的结果是写 testing.
并出现在屏幕上:
X = 1 ;
X = 2 ;
X = 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
,但 不会 如果您通过 swipl -g testing ...
从 shell 调用 testing
。
另请查看可用于使用预期变量名称的重要 variable_names/1
选项。
我将根据您的具体用例定制此输出作为练习。理想情况下,输出应该是一个适当的 Prolog term,这样您实际上可以 test 通过阅读 read/1
并比较它它作为参考结果。
我在名为 "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.pl" 文件的某个位置写入 testing.
并让 funcA(X) 执行与我使用解释器查询时相同的操作,因此 funcB(X) 将检查 X 可以从 fact(N) 和 return 中获取的所有值。
我希望的结果是写 testing.
并出现在屏幕上:
X = 1 ;
X = 2 ;
X = 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
,但 不会 如果您通过 swipl -g testing ...
从 shell 调用 testing
。
另请查看可用于使用预期变量名称的重要 variable_names/1
选项。
我将根据您的具体用例定制此输出作为练习。理想情况下,输出应该是一个适当的 Prolog term,这样您实际上可以 test 通过阅读 read/1
并比较它它作为参考结果。