Прямая цепочка и обратная цепочка в java

Каким будет лучший подход для реализации прямой и обратной цепочки для процесса рассуждений в java?

Нам дали базу знаний в форме Хорна, которая имеет набор утверждений.

Я пытался искать в Интернете, но не смог найти никакого описания того, как реализовать такую ​​​​концепцию искусственного интеллекта в кодировании.

Мое понимание :

До сих пор я думал, что прочитаю каждое предложение (Форма Рога) и создам из него объект. Каждый объект класса Sentence будет иметь переменные отношения, и когда я буду запрашивать базы знаний для цепочки Backward или Forward, он проверит массив этих объектов и построит нужную цепочку.

 public class Sentence{

    private String impliedBy;
    private String implementedVar;

    public Sentence(String sentence){
       String[] relation = sentence.split("=>");
       this.impliedBy = relation[0];
       this.implementedVar = relation[1];
    }
    ...
 }

Вызов выше класса, говоря...

Sentence s = new Sentence("a&b=>c");

Я на правильном пути? Извините, я новичок в такого рода сложном программировании, и, согласно моему прогнозу, мне может потребоваться много оптимизации, чтобы выполнять такие рассуждения на очень высоком уровне. Но, похоже, мне нужно хорошее понимание со стороны кого-то, спасибо, если кто-то из вас может помочь...

Спасибо!


person TeaCupApp    schedule 23.05.2011    source источник


Ответы (4)


Я бы использовал механизм правил, такой как Drools или JESS, прежде чем я попытаюсь написать это для себя.

Если ваша цель не состоит в том, чтобы научиться писать механизм правил Rete, в этом случае я отзову свой ответ. Я бы поискал статьи Чарльза Форги.

person duffymo    schedule 23.05.2011
comment
Я бы предположил, что это домашнее задание. И проверить, выполняется ли простое предложение Хорна, на самом деле не так уж сложно. Даже HORNSAT на самом деле не должно быть слишком сложно сделать правильно, но тогда нам нужно знать, что именно должно быть реализовано. - person Voo; 23.05.2011
comment
Большое спасибо, я расширил свое понимание этих методов ... Однако мне, возможно, придется больше исследовать, чтобы на самом деле реализовать на более высоком уровне, поэтому, как сказал Ву, мою домашнюю работу должно быть легче решать, но я подумал, что если я чему-то учусь, почему бы и нет чтобы узнать правильный и эффективный способ, :) Спасибо - person TeaCupApp; 23.05.2011
comment
@Voo Да, приятель, ты прав! Это будет довольно легко реализовать, если мои вышеприведенные мысли (в вопросе) будут правильными. :) Спасибо за помощь. - person TeaCupApp; 23.05.2011

см. здесь описание того, как продвигаться вперед цепочка работает в линейном времени по количеству переменных (обратите внимание, как реализация во фрагменте перебирает предложения для каждой переменной в повестке дня). Он поставляется без кода, но Hornsat на самом деле не так уж сложно закодировать.

person kutschkem    schedule 02.05.2012

Такие системы, как OPS5, обычно имеют компонент логического вывода, который использует прямую цепочку. Пролог, с другой стороны, обычно использует обратную цепочку.

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

Также возможно построить системы, которые могут включать обратную цепочку внутри прямой цепочки контролируемым образом. Одной из таких систем является Jekejeke Minlog< /а>.

Возможная реализация а-ля Марвин Мински могла бы состоять в том, чтобы рассматривать HornClauses как сеть. HornClauses, у которых есть заголовок X, и HornClauses, у которых есть X в теле, будут связаны.

  A <- D, X      X <- G
          |      |
          +------+

Теперь тело HornClause действует как своего рода логический элемент AND, а поскольку разные HornClause могут иметь одну и ту же головку, здесь также задействован вентиль OR. Теперь попытайтесь запрограммировать что-то, что будет распространять истину через эти врата.

Пока

person Mostowski Collapse    schedule 12.08.2013

Ну, что также может помочь, так это использование:

Карта HashMap = новая HashMap(); map.put(подразумеваетсяBy,подразумеваетсяVar);

Получить переменную просто: String value = map.get(impliedBy).

person msj121    schedule 23.05.2011