Logi c программирование в python - PullRequest
0 голосов
/ 08 апреля 2020

Я работаю над проектом, который в основном основан на программировании c. Я заранее определил соответствующие правила и факты, которые программа использует для вычисления вероятностей, затем эти вероятности добавляются к данным и вводятся в дальнейшую модель машинного обучения. Программу для расчета вероятностей можно легко определить в прологе, например, следующим образом:

has_lot_work(daniel, 8). %number of lets say urgent tasks
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). %30 percent of current smokers get asthma
to_have_asthma(X, Prob) :- to_smoke(X, P2), Prob is P2 * 0.25. %25 percent of smokers-to-be will get asthma
friends(X, Y) :- friend(X, Y).
friends(X, Y) :- friend(Y, X).
influences(X, Y, 0.4) :- friends(X, Y). %friends influence each other by 40 percent
friend(peter, david).
friend(peter, rebecca).
friend(daniel, rebecca).
smokes(peter).
smokes(rebecca).

В этом примере меня интересует расчет вероятности того, что кто-то курит (to_smoke (Who, Prob)) и чтобы получить астму (to_have_asthma (Кто, Проба)). Я использую python для получения и очистки данных и для модели ML впоследствии, поэтому я хотел также применить эту логику c в python. Но я не смог найти способ сделать логические c вычисления, и я не смог найти правильный способ связать python с прологом без ошибок и проблем.

Ответы [ 3 ]

2 голосов
/ 08 апреля 2020

Я попытался разработать что-то, что использует синтаксис пролога, подход и возврат в 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}]
1 голос
/ 08 апреля 2020

У вас есть несколько вариантов, но в AFAIK нет встроенных методов или предикатов для Python, поэтому вам нужно обращаться к нему как к библиотеке как таковой.

  1. Один популярный способ его использования miniKanren . Я не использовал это, но достаточно просто посмотреть на его синтаксис, чтобы я в ужасе убежал.

  2. Другой подход - найти интерфейс между Python и Prolog и одним популярным один находится между Python и SWI-Prolog, например pyswip . Их много, поэтому вам придется искать и проверять, какой из них лучше всего подходит для ваших нужд. Опять же, я не использовал их.

Если вы сделаете go с этим выбором использовать библиотеку для подключения к SWI-Prolog, я знаю, что эти questions время от времени всплывает на форуме SWI-Prolog.

Я бы выбрал этот вариант, когда вы получите доступ к полнофункциональному Prolog с вырезкой, возвратом, табулированием и т. д. c.

Гораздо более сложный подход, но который даст наибольшее понимание, состоит в том, чтобы реализовать логику c в Python самостоятельно. См .: Реализация алгоритма объединения Prolog в Python? Отступление
1 голос
/ 08 апреля 2020

PyLog, кажется, то, что вы ищете. https://pypi.org/project/pylog/

pip install pylog
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...