Я попытался разработать что-то, что использует синтаксис пролога, подход и возврат в python для решения проблемы. Я написал pytholog библиотеку. Я делюсь ответами, чтобы получить комментарии, и если есть лучшие способы сделать это.
В pytholog я начинаю базу знаний и запрашиваю ее.
import pytholog as pl
friends_kb = pl.KnowledgeBase("friends")
friends_kb([
"has_lot_work(daniel, 8)",
"has_lot_work(david, 3)",
"stress(X, P) :- has_lot_work(X, P2), P is P2 / 100",
"to_smoke(X, Prob) :- stress(X, P1), friends(Y, X), influences(Y, X, P2), smokes(Y), Prob is P1 + P2",
"to_have_asthma(X, 0.3) :- smokes(X)",
"to_have_asthma(X, Prob) :- to_smoke(X, P2), Prob is P2 * 0.25",
"friends(X, Y) :- friend(X, Y)",
"friends(X, Y) :- friend(Y, X)",
"influences(X, Y, 0.4) :- friends(X, Y)",
"friend(peter, david)",
"friend(peter, rebecca)",
"friend(daniel, rebecca)",
"smokes(peter)",
"smokes(rebecca)"
])
print(friends_kb.query(pl.Expr("to_smoke(Who, P)")))
# [{'Who': 'daniel', 'P': 0.48000000000000004}, {'Who': 'david', 'P': 0.43000000000000005}]
print(friends_kb.query(pl.Expr("to_have_asthma(Who, P)")))
# [{'Who': 'peter', 'P': '0.3'}, {'Who': 'rebecca', 'P': '0.3'}, {'Who': 'daniel', 'P': 0.12000000000000001}, {'Who': 'david', 'P': 0.10750000000000001}]