Разрешены ли функциональные символы в механизмах правил/алгоритме Рете?

ИИ: современный подход приводит алгоритм Rete при обсуждении вывода в логика первого порядка.

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

a(X) ∧ b(X, Y) → c(Y)

но нет

a(f(X)) ∧ b(X, Y) → c(f(Y))

(Разница может быть фундаментальной, так как это разница между Prolog и Datalog, только один из которых является полным по Тьюрингу)

Ограничен ли алгоритм Рете правилами, не содержащими функциональных символов? Обрабатывают ли современные механизмы правил, такие как Drools и CLIPS, функциональные символы?


person bobcat    schedule 03.01.2021    source источник
comment
Если я правильно понимаю ваши обозначения, то да, движок Drools позволяет оценивать функции как в условиях, так и в последствиях. Но я не могу говорить за другие двигатели.   -  person Roddy of the Frozen Peas    schedule 04.01.2021
comment
То же самое для CLIPS   -  person Gary Riley    schedule 05.01.2021
comment
@RoddyoftheFrozenPeas функциональные символы в логике могут отличаться от функций в других местах. Вот лакмусовая бумажка: можете ли вы использовать логическую переменную в качестве аргумента для этих функций, когда вы устанавливаете правила? (см. второй пример в вопросе)   -  person bobcat    schedule 06.01.2021
comment
@GaryRiley См. мой ответ Родди.   -  person bobcat    schedule 06.01.2021
comment
@MaxB Мне непонятна концепция функционального символа.   -  person Gary Riley    schedule 07.01.2021
comment
@GaryRiley Они позволяют вам говорить такие вещи, как если чей-то отец богат, то он / она тоже богат: rich(father(X)) → rich(X). Здесь father — функциональный символ.   -  person bobcat    schedule 07.01.2021
comment
@MaxB В чем разница между вашим первым и вторым примерами на таком языке, как Пролог?   -  person Gary Riley    schedule 07.01.2021
comment
@GaryRiley Можете ли вы задать вопрос в теге prolog вместо того, чтобы комментировать здесь?   -  person bobcat    schedule 08.01.2021
comment
@MaxB Я только что упомянул Пролог, потому что вы это сделали. Если нет простого способа объяснить аргументы функций или почему вы хотите их использовать, кому-то будет сложно ответить на ваш вопрос. Ваши примеры не проливают света на то, что делают аргументы функций.   -  person Gary Riley    schedule 08.01.2021
comment
@GaryRiley Функциональные символы (sic) являются частью определения логики первого порядка. Я бы посоветовал указать rich(father(X)) → rich(X) в CLIPS. Вы могли бы (вроде) сформулировать это так rich(X) ^ father(X, Y) -> rich(Y), но это другое, потому что функциональные символы подразумевают существование и уникальность father кого-то. В Прологе функциональные символы используются для определения всех структур данных.   -  person bobcat    schedule 08.01.2021
comment
@GaryRiley Кстати, они необязательны в FOL, а не в Прологе: math.stackexchange.com/questions/125818/   -  person bobcat    schedule 08.01.2021
comment
На данный момент вопрос слишком широк. Не будет ни одного человека, который может написать один ответ для каждой машины правил под солнцем. Если вы хотите узнать о Drools и можете сформулировать псевдокод правила на простом английском языке, то кто-то вроде меня может ответить, возможно ли это или поддерживается. Если вы хотите узнать о CLIP, кто-то вроде Гэри может сделать то же самое.   -  person Roddy of the Frozen Peas    schedule 08.01.2021
comment
@RoddyoftheFrozenPeas Мой пример был недостаточно простым по-английски? Попробую еще раз: Для каждого человека существует один и только один отец указанного человека, и если отец человека богат, то и он/она тоже . Если вы эксперт по слюням и даже не понимаете концепцию функциональных символов, похоже, что в слюнях их нет.   -  person bobcat    schedule 08.01.2021
comment
Женя, не надо хамить. Я не занимался формальной логикой с 12 лет, @MaxB. Простите меня за то, что я не помню основы начальной школы, в которых я никогда не нуждался профессионально. Проблема с вашим примером в том, что нет никаких последствий. Если я выполню ваши условия, то что? У вас есть только половина правила. Я могу написать вам правило, которое определяет, когда ваши условия нарушаются, или я могу написать вам правило, когда ваши условия выполняются. Вы не указали, какие из них вас интересуют или что должно произойти в этом событии.   -  person Roddy of the Frozen Peas    schedule 09.01.2021
comment
Я хочу сказать, что ваш вопрос слишком широк, потому что нет одного ответа.   -  person Roddy of the Frozen Peas    schedule 09.01.2021
comment
@RoddyoftheFrozenPeas Q предназначен для людей, которые понимают FOL. Если вы этого не сделаете, это не делает проблему с Q. (Кстати, я очень сомневаюсь, что FOL является частью какой-либо учебной программы начальной школы)   -  person bobcat    schedule 15.01.2021
comment
Сомневаюсь, что вы хотели бы от учебных программ, но это все еще слишком широкий вопрос, потому что не может быть единого ответа.   -  person Roddy of the Frozen Peas    schedule 15.01.2021
comment
Также стоит отметить, что Drools теперь основан на phreak, а не на rete. Drools 5 (я думаю) был последним, который был чистым рете. Phreak похож, но основан на коллекциях, а не на кортежах.   -  person Roddy of the Frozen Peas    schedule 15.01.2021


Ответы (2)


В CLIPS вы бы реализовали правило следующим образом. Для каждого человека существует один и только один отец указанного человека, и если отец человека богат, то и он/она тоже:

(defrule inherited-wealth
   (forall (person ?p)
           (father ?p ?f)
           (not (father ?p ~?f)))
   (person ?p)
   (father ?p ?f)
   (rich ?f)
   =>
   (assert (rich ?p)))
person Gary Riley    schedule 08.01.2021
comment
На самом деле есть два правила. Первый ( Для каждого человека существует один и только один отец указанного человека ) должен указать существование. Я не вижу этого в вашем коде. - person bobcat; 15.01.2021
comment
Это то, что делает оператор forall. - person Gary Riley; 15.01.2021
comment
Зачем вообще нужен форал? Даже без обтекания, ведь все это правило выполняется одинаково, не так ли? - person Akaedintov; 16.01.2021
comment
@Akaedintov Нет, не будет. Форалл является сокращением от (не (человек ?p) (не (и (отец ?p ?f) (не (отец ?p ~?f)))). Необходимо гарантировать, что у каждого человека есть один и только один отец . - person Gary Riley; 17.01.2021

Проблема с вашим примером заключается в том, что Drools работает с объектами Java. Условное условие, что у каждого человека есть только один отец, обеспечивается определением переменной Father как экземпляра, а не как списка. Это упрощает проверку до нулевой проверки.

В Drools вы бы реализовали этот вариант использования на простом английском языке следующим образом:

Для каждого человека существует один и только один отец указанного лица, и если отец человека богат, то и он/она тоже.

rule "A person has a rich father and is rich"
when
  not( Person(father == null ))

  $person: Person( $father: father,
                            isRich == true )
  Person( isRich == true ) from $father
then
  // Insert consequences here
end

Правая часть этого правила (следствие) будет срабатывать для каждого богатого человека, чей отец богат. Предложение not в начале проверяет, что все экземпляры Person в вашей рабочей памяти имеют отца. Каждый человек, переданный в рабочую память, оценивается по его личным достоинствам, даже если передано несколько человек.

В основном, как бы вы прочитали это было бы: У всех людей есть отец. У каждого богатого человека есть богатый отец. Если вы инертите дизайн объекта и проверяете детей, вы можете утверждать что-то вроде того, что если человек богат, то все дети богаты.

Для полноты смоделированный здесь класс Java выглядит следующим образом:

public class Person {
  private Person father;
  private boolean isRich;
  public Person getFather() { return this.father; }
  public Person getIsRich() { return this.isRich; }
  // Setter methods omitted for brevity
}

Конечно, если вместо этого вы пытаетесь проверить ситуации, в которых вы не соответствуете этому условию, вы, конечно, можете инвертировать его:

rule "A person exists without a father"
when
  exists( Person( father == null) )
then
  // Do something for situation if there's a father-less person
end

rule "A person is rich and their father is not rich"
when
  Person( $father: father != null, 
                   isRich == true )
  Person( isRich == false ) from $father
then
  // Do something for the poor father
end

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

Drools — это язык бизнес-правил. Он предназначен для использования в комбинациях условий и последствий — если эти условия верны, сделайте это. Ваш сценарий представляет собой простое утверждение, а не условное + последствие, поэтому здесь немного сложно смоделировать, поскольку в нем отсутствуют последствия.

Однако у него есть то преимущество, что оно неявно применяется к каждому вводу без необходимости указывать циклы или рекурсивные функции. Способ, которым вышеизложенное (как положительные, так и отрицательные случаи) будет вызываться, будет состоять в том, чтобы создать коллекцию экземпляров Person и передать их все сразу в сеанс. Drools будет оценивать каждый экземпляр Person по его собственным достоинствам в сравнении с входными данными. Любые изменения в этих экземплярах без вызова одной из специальных функций «обновления» Drools (update, insert, modify, retract) будут игнорироваться с точки зрения оценки того, действительно ли правило. Так, например, если я передаю экземпляр Person без отца, а затем в одном из моих правил добавляю Person, с точки зрения предложения when мой Person все еще не имеет отца; правила оцениваются в отношении безупречных входных данных, если только я специально не уведомлю Drools об ином, используя вышеупомянутые функции.

person Roddy of the Frozen Peas    schedule 08.01.2021
comment
Правило должно утверждать, что для каждого человека существует один и только один отец... Вместо этого вы используете его существование как условие. В вашей интерпретации поле father никогда не должно быть нулевым. Разве Друлс не может заявить об этом безоговорочно? - person bobcat; 15.01.2021
comment
Что такое заявление в мире условий и последствий? Я отнесся к этому как к состоянию. Поскольку утверждение может быть истинным или ложным, это казалось подходящим способом его моделирования. Если утверждение верно, правило оценивает; если утверждение ложно, это не так (если вы не инвертируете условие). - person Roddy of the Frozen Peas; 15.01.2021
comment
Drools — это язык бизнес-правил. Он не предназначен для моделирования абстрактных логических конструкций. Если у вас есть датчики температуры и заявление, если какой-либо датчик сообщает › 120 градусов непрерывно в течение 3 минут, то включите пожарную сигнализацию ... мы можем сделать это со слюнями. Ваш пример с богатым/бедным человеком наполовину переводится, если вы относитесь к нему как к условному выражению, но ваши правила заботятся о том, хотите ли вы знать, верно ли это или ложно, и это изменит то, как вы пишете. ваше правило. - person Roddy of the Frozen Peas; 15.01.2021