Прямая и обратная цепочка в Java - PullRequest
5 голосов
/ 23 мая 2011

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

Нам предоставлена ​​база знаний в форме рога, в которой есть набор утверждений.

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

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

До сих пор я думал, что будупрочитайте каждое предложение (Horn-Form) и создайте его объект.Каждый объект класса Sentence будет иметь переменные отношения, и когда я буду запрашивать базы знаний для цепочки «Назад» или «Вперед», он проверит массив этих объектов и создаст желаемую цепочку.

 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");

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

Спасибо!

Ответы [ 5 ]

6 голосов
/ 23 мая 2011

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

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

2 голосов
1 голос
/ 12 августа 2013

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

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

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

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

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

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

Пока

1 голос
/ 02 мая 2012

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

0 голосов
/ 23 мая 2011

Хорошо, что также может помочь, используя:

HashMap map = new HashMap ();map.put (impliedBy, impliedVar);

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

...