2017-11-18 95 views

回答

5

纯  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来进一步概括谓词,使所有内容都完全纯粹,并从上述优势中受益。请注意,患者可能有几种疾病,可通过回溯发射。

因此:,没有参数的规则在您的实际 代码中至少出现可疑和非典型的情况。除了“测试 案例”和“一致性 检查”等方案外,它只能用于其副作用,并且我建议您尽可能避免副作用。

有关此主题的更多信息,请参阅

4

cancer()是不合法的语法,但这个想法非常好。

只是做的呼叫作为

cancer 

,并把它定义为一个事实或规则。

cancer. % fact 

cancer :- blah blah %rule 

其实,你使用的系统谓语用在你的程序无参数 -

nl是谓词总是成功,并打印一个换行符。

有很多理由没有参数的谓词。假设您有一台服务器在生产中的配置与开发中的稍有不同。开发者访问API已停产。如果我们在开发环境

,或者你可能有副作用衬托,或使用状态是

my_handler(Request) :- 
     development, 
     blah blah 

发展才能成功。