不传递变量的规则是否违背了声明式编程或prolog的原理?
例如,dog(X)说X是一只狗,但我的癌症声明只是检查是否满足以下条件。有更好的方法吗?不传递变量的规则是否违背了声明式编程或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"). 并将其定义
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).