不传递变量的规则是否违背了声明式编程或prolog的原理?

不传递变量的规则是否违背了声明式编程或prolog的原理?,prolog,logical-purity,Prolog,Logical Purity,例如,dog(X)说X是一只狗,但我的癌症声明只是检查是否满足以下条件。有更好的方法吗?cancer()不是合法的语法,但是这个想法很好 按要求打电话就行了 cancer():- pain(strong), mood(depressed), fever(mild), bowel(bloody), miscellaneous(giddy). diagnose():- nl, cancer()->write("has cancer"). 并将其定义

例如,dog(X)说X是一只狗,但我的癌症声明只是检查是否满足以下条件。有更好的方法吗?

cancer()
不是合法的语法,但是这个想法很好

按要求打电话就行了

cancer():-
   pain(strong),
   mood(depressed),
   fever(mild),
   bowel(bloody),
   miscellaneous(giddy).

diagnose():-
   nl,
   cancer()->write("has cancer").
并将其定义为事实或规则

cancer
事实上,您使用的系统谓词在程序中没有参数-

nl
是一个始终成功的谓词,并打印换行符

有很多原因可以让谓词不带参数。假设您有一台服务器,它在生产环境中运行的配置与在开发环境中运行的配置略有不同。开发人员访问API已在生产中关闭

cancer.   % fact

cancer :- blah blah  %rule
只有在开发环境中,开发才能成功


或者您可能会产生副作用,或者正在使用状态。

pureProlog中,没有任何参数的谓词只能成功或失败(或者不能终止atall)

因此,它只能编码很少的信息。始终成功的谓词已可用:
true/0
,具有零参数。始终失败的谓词也已可用:
false/0
,也有零参数。不终止的谓词可以很容易地构造

所以,在这个意义上,你不需要更多的零参数谓词,我认为你完全有理由怀疑这些谓词

具有零参数的谓词用途有限,因为它们非常具体。然而,它们可以用于描述一组固定的测试,或者仅对其副作用有用。这也是您正在使用的,通过在谓词成功的情况下在终端上发出输出

这意味着您将离开Prolog的纯子集,现在依赖于purelogic之外的特性

这通常是一个非常糟糕的想法,因为它:

  • 防止或至少使有关程序的多种形式的推理复杂化
  • 使测试谓词变得更加困难
  • 一般来说,它不是线程安全的
  • 等等
因此,假设您按如下方式编写程序:

my_handler(Request) :-
      development,
      blah blah
癌症(病人):- 患者疼痛(患者,强烈), 患者情绪(患者、抑郁), 患者发热(患者,轻度), 病人肠道(病人,带血), 病人(病人,头晕)。 该谓词现在由患者参数化,因此比您发布的内容更具一般性

现在,它可以用于对多个患者进行推理,也可以用于对不同患者进行并行推理,您可以使用序言查询来测试谓词等

您可以通过定义例如
patient\u diagnosis/2
,进一步概括谓词,保持所有内容完全纯净,并从上述优势中获益。请注意,患者可能患有多种疾病,这些疾病可在回溯时发出

因此:,没有参数的规则如果出现在您的实际代码中,至少是可疑的和非典型的。撇开诸如“testcase”和“consistencycheck”之类的场景不谈,它只对其副作用有用,我建议您尽可能避免副作用

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

cancer(Patient):- patient_pain(Patient, strong), patient_mood(Patient, depressed), patient_fever(Patient, mild), patient_bowel(Patient, bloody), patient_miscellaneous(Patient, giddy).