在 Pytholog 中使用 NOT

Using NOT in Pytholog

我最近在介绍 Symbolic 时爱上了 Prolog A.I。 我觉得如果Python能和Prolog结合起来,我就能做出A.I。明白事情。

我找到了“Pytholog”库,我很高兴能使用它...除了我不能在 Pytholog 中使用 not(),这与在 Prolog 中不同。

我的代码是一个医疗系统,可以告诉某人服用哪种药物。这是简化版:

!pip install pytholog
import pytholog as pl

medicine_bash = pl.KnowledgeBase()
medicine_bash([
"relieves(aspirin, headache).",
"relieves(new_med, headache).",
"aggravate(aspirin, asthma).",
"aggravate(aspirin, peptic_ulcer).",
"should_not_take(Person, Drug):- precondition(Person, Precondition), aggravate(Drug, Precondition).",
"should_take(Person, Drug):- suffers_from(Person, Symptom), precondition(Person, Precondition), relieves(Drug, Symptom), not(aggravate(Drug, Precondition)).",
"suffers_from(albert, headache).",
"precondition(albert, peptic_ulcer)."
])

print(medicine_bash.query(pl.Expr("should_take(albert, Drug).")))

以上输出['No']。我怎么能改变 not()?

要使用 not,您需要在谓词前添加 -

还有neq关键字,可用于不等式neq(x,y)(x is not y)

这是一个工作版本:

import pytholog as pl

medicine_bash = pl.KnowledgeBase()
medicine_bash([
"relieves(aspirin, headache)",
"relieves(new_med, headache)",
"-aggravate(new_med, peptic_ulcer)",
"aggravate(aspirin, asthma)",
"aggravate(aspirin, peptic_ulcer)",
"should_take(Person, Drug) :- suffers_from(Person, Symptom), precondition(Person, Pre), relieves(Drug, Symptom), -aggravate(Drug, Pre)",
"suffers_from(albert, headache)",
"precondition(albert, peptic_ulcer)"
])

print(medicine_bash.query(pl.Expr("should_take(albert, Drug)"), show_path=True))

缺少的东西是告诉 new_med 加重的负面。此外,非常重要的是(正如我的调试验证的那样)不要将点放在字符串或查询上。