Prolog中fail/0与1=2这类失败目标是否等价?两种终止测试是否相同?
Prolog中fail/0与失败目标的等价性及终止测试问题
背景
在Prolog里,fail/0谓词可用来测试目标的终止性,例如查询:
?- q, fail.
若该查询能终止,即可判定单独的查询?- q.同样会终止。
问题
fail/0是否等价于任意失败目标(如1=2)?- 测试查询
?- q, 1=2.是否和上述?- q, fail.的终止测试效果相同?
回答
- 从终止性测试的核心需求来看,
fail/0和1=2这类失败目标的作用是一致的:只要q能终止,不管后续跟的是fail还是1=2,整个合取查询都会终止;如果q无法终止,这两个合取查询也都会无限运行。 - 但严格语义上,二者并非完全等价:
fail/0是Prolog内置的专用失败谓词,语义就是直接触发失败;而1=2是通过项的不等比较导致失败,部分Prolog实现的底层处理可能存在细微差别,但这种差别不会影响终止性测试的结果。 - 结论:用于测试
q的终止性时,?- q, fail.和?- q, 1=2.这两个测试的效果完全相同。
内容的提问来源于stack exchange,提问作者Prolog ByExample
相关产品推荐
相关产品推荐

