Можете ли вы «научить» компьютеры выполнять алгебру, используя переменные выражения (например, aX bX = (a b) X)

#machine-learning #artificial-intelligence

#машинное обучение #искусственный интеллект

Вопрос:

Допустим, в примере нижний регистр является постоянным, а верхний — переменным.

Я хотел бы иметь программы, которые могут «разумно» выполнять определенные задачи, такие как алгебра, но обучение новым методам программы должно быть простым, используя символы, понятные людям. Например, если программа сообщила эти факты:

aX bX = (a b) X

если a = bX, то X = a / b

Тогда он должен уметь выполнять следующие операции: 2a 3a = 5a

3x 3x = 6x

3x = 1, следовательно, x = 1/3

4x 2x = 1 -> 6x = 1, следовательно, x = 1/6

Я пытался делать аналогичные вещи с помощью Prolog, поскольку он может легко «понимать» переменные, но тогда у меня было слишком много сложностей, главным образом потому, что два описания отношений в обоих направлениях приводят к сбою. (нелегко разобраться)

Подводя итог: я хочу знать, есть ли программа, которую можно обучать алгебре, используя только математические символы. Я хотел бы знать, пробовали ли это другие люди и насколько сложным это должно быть. Цель этого — упростить программирование (время выполнения не так важно)

Комментарии:

1. Короткий ответ «Да». Проблема в том, что я недостаточно квалифицирован, чтобы точно объяснить вам, как это работает.

Ответ №1:

Это зависит от того, что вы хотите, чтобы машина делала и насколько она должна быть интеллектуальной.

Ваш вопрос в основном касается ИИ, но не ML. ИИ занимается формализацией «человеческих» задач, в то время как ML (хотя и является подмножеством ИИ) касается построения моделей на основе данных.

Описанная программа может быть реализована следующим образом:

Каждый факт формирует шаблон. Программа, заданная с выражением и некоторыми шаблонами, может попытаться применить некоторые из них к выражению и посмотреть, что произойдет. Если вы хотите, чтобы ваша программа могла, например, решать квадратные уравнения по заданному правилу, например ax² bx c = 0 → x = (-b ± sqrt(b²-4ac))/(2a) , тогда она будет разработана следующим образом:

Кто-то дает набор правил. Правило состоит из шаблона и результата (решения или эквивалентной формы). Подумайте о шаблоне как о регулярном выражении.

Затем программе предлагается проявить некоторый интеллект и доказать свои знания, выполнив что-то с заданным выражением. Здесь начинается основная часть:

  • вы строите график выражений, применяя возможные правила (если шаблон применим к выражению, вы добавляете новую вершину с соответствующим результатом).
  • Затем вы запускаете некоторый алгоритм поиска пути (например, A *), чтобы найти последовательность преобразований, ведущих к форме, подобной x = ...

Ответ №2:

Я думаю, что это интересный вопрос, хотя он не по теме в SO (рекомендация инструмента)

Но, тем не менее, поскольку это захватило мое воображение, я написал пару функций с использованием R, которые могут довольно легко решать подобные вещи

Сначала вам нужно будет установить R, после слов вам нужно будет загрузить пакет с именем stringr

Итак, в консоли R запустите

 install.packages("stringr")
library(stringr)
  

И затем вы можете определить следующие функции, которые я написал

 FirstFunc <- function(temp){
paste0(eval(parse(text = gsub("[A-Z]", "", temp))), unique(str_extract_all(temp, "[A-Z]")[[1]]))
}

SecondFunc <- function(temp){
 eval(parse(text = strsplit(temp, "=")[[1]][2])) / eval(parse(text = gsub("[[:alpha:]]", "", strsplit(temp, "=")[[1]][1])))
}
  

Теперь первая функция будет решать уравнения типа

aX bX = (a b) X

В то время как второй будет решать уравнения типа

4x 2x = 1

Например

 FirstFunc("3X 6X-2X-3X")
  

вернет

 "4X"
  

Теперь эта функция довольно примитивна (в основном для иллюстрации) и будет решать уравнения, содержащие только один тип переменной, что-то вроде FirstFunc("3X-2X-2Y") не даст правильного результата (но функцию можно легко изменить)

Вторая функция будет решать такие вещи, как

 SecondFunc("4x-2x=1")
  

вернет

 0.5
  

или

 SecondFunc("4x 2x*3x=1")
  

вернет

 0.1
  

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