在纯 Prolog的,没有任何参数谓词可以只成功或失败(或不终止 全部)。
因此,它只能编码很少的信息。一个总是成功的谓词已经可用:true/0
,有零个 参数。总是失败的谓词也已可用:false/0
,也有零个 参数。一个谓词从来没有 终止可以很容易地构建。因此,从这个意义上说,你不需要更多的谓词和零参数,我认为你完全有理由怀疑这样的谓词。
具有零参数的谓词使用有限,因为它们如此特殊。然而,它们可能用于描述固定的一组测试,或者仅用于它们的副作用。这也是你正在使用的,通过在终端发出输出以防止谓词成功。
这意味着您将离开Prolog的纯子集,现在依赖于超出纯逻辑的功能。
这通常是一个非常糟糕的主意,因为它:
- 阻止或至少约程序推理的多种形式
- 使得它更难测试谓词
复杂
- 不是线程 一般安全
- 等
因此,如下假设你写你的程序:
cancer(Patient):-
patient_pain(Patient, strong),
patient_mood(Patient, depressed),
patient_fever(Patient, mild),
patient_bowel(Patient, bloody),
patient_miscellaneous(Patient, giddy).
现在这个谓词是由病人参数化,从而显著比你贴什么比较一般。
现在可以用来推理几个病人,它可以用来在 并行对不同患者道理,你可以使用一个Prolog的 查询测试谓语等
您可以通过定义例如patient_diagnosis/2
来进一步概括谓词,使所有内容都完全纯粹,并从上述优势中受益。请注意,患者可能有几种疾病,可通过回溯发射。
因此:是,没有参数的规则在您的实际 代码中至少出现可疑和非典型的情况。除了“测试 案例”和“一致性 检查”等方案外,它只能用于其副作用,并且我建议您尽可能避免副作用。
有关此主题的更多信息,请参阅logical-purity。
来源
2017-11-18 10:13:05
mat