Алгоритм обратной и прямой цепочки для (экспертная система) в Python

Я ищу алгоритм обратной и прямой цепочки, чтобы реализовать его с помощью Python. Я посмотрел в Интернете, но я не нашел слишком много. Я тоже посмотрел в Википедии, но я нашел некоторые правила и не нашел алгоритмы.

1 ответ

Я знаю, что вы изначально пометили свой предыдущий вопрос Python, поэтому я ограничусь этим только Python.

При поиске примеров кода одним хорошим местом является поиск в репозиториях Github. Запрос для backward chaining а затем ограничение результатов до Python выдаст этот запрос. Вы можете сделать то же самое для forward chaining,

Обратите внимание, что вам нужно будет найти понравившиеся примеры кода, а затем тщательно протестировать его, прежде чем использовать его. Там есть отличные примеры, но, скорее всего, попытки сделать это неверны. Планируйте провести с ними несколько дней и создать множество тестовых случаев. Весь код там идет без гарантий.

Если вы хотите только алгоритм, то найдите книги для Artificial Intelligence такие как Искусственный интеллект... Джорджа Ф. Люгера или Искусственный интеллект... Рассела и Норвиг.

Механизмы вывода с прямой цепью могут быть относительно легко реализованы в Python. Это список правил вывода:

mammal(A) ==> vertebrate(A).
vertebrate(A) ==> animal(A).
vertebrate(A),flying(A) ==> bird(A).
vertebrate("duck").
flying("duck").
mammal("cat").

Эти правила могут быть переведены на Python:

global facts
global is_changed

is_changed = True
facts = [["vertebrate","duck"],["flying","duck"],["mammal","cat"]]

def assert_fact(fact):
    global facts
    global is_changed
    if not fact in facts:
        facts += [fact]
        is_changed = True

while is_changed:
    is_changed = False
    for A1 in facts:
        if A1[0] == "mammal":
            assert_fact(["vertebrate",A1[1]])
        if A1[0] == "vertebrate":
            assert_fact(["animal",A1[1]])
        if A1[0] == "vertebrate" and ["flying",A1[1]] in facts:
            assert_fact(["bird",A1[1]])

print(facts)

Исходный набор фактов делает механизм вывода следующим списком:

[['vertebrate', 'duck'], ['flying', 'duck'], ['mammal', 'cat'], ['animal', 'duck'], ['bird', 'duck'], ['vertebrate', 'cat'], ['animal', 'cat']]
global facts
global is_changed

is_changed = True
facts = [["plant","mango"],["eating","mango"],["seed","sprouts"]]

def assert_fact(fact):
    global facts
    global is_changed
    if not fact in facts:
        facts += [fact]
        is_changed = True

while is_changed:
    is_changed = False
    for A1 in facts:
        if A1[0] == "seed":
            assert_fact(["plant",A1[1]])
        if A1[0] == "plant":
            assert_fact(["fruit",A1[1]])
        if A1[0] == "plant" and ["eating",A1[1]] in facts:
            assert_fact(["human",A1[1]])

print(facts)
Другие вопросы по тегам