Пролог для начинающих — это плохая идея?

Приложение, над которым я работаю, является своего рода «конфигуратором». Он написан на C#, и я даже написал для него механизм правил. Идея состоит в том, что существует набор логических утверждений, из которых пользователь может выбирать. В зависимости от того, что они выбрали, некоторые другие элементы становятся обязательными или полностью недоступными.

Утверждения пропозициональной логики обычно принимают следующие формы:

A => ~X 
ABC => ~(X+Y) 
A+B => Q 
A(~(B+C)) => ~Q A <=> B

Символы:

=>  -- Implication
<=> -- Material Equivalence
~   -- Not
+   -- Or
Two letters side-by-side -- And

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

Кроме того, все доступные параметры находятся в иерархии. Например:

Outside
   Color
      Red
      Blue
      Green
   Material
      Wood
      Metal

Если подразумевается элемент второго уровня (функция, такая как Цвет), то должен быть выбран элемент третьего уровня (параметр, например Красный). Точно так же, если мы знаем, что функция ложна, то все параметры под ней также ложны.

Загвоздка в том, что у каждого продукта есть свой набор правил. Разумно ли создать базу знаний, содержащую эти операторы в качестве предикатов, а затем во время выполнения начать создавать все правила для продукта?

Я представляю, как это могло бы работать, — установить идею компонентов, функций и опций. Затем установите отношения между ними (например, если свойство ложно, то и все его параметры ложны). Во время выполнения добавьте особые правила продукта. Затем передайте все выборки пользователя функции, получая в качестве вывода, какие элементы являются истинными, а какие ложными.

Я не знаю всех последствий того, о чем я спрашиваю, поскольку я только знакомлюсь с Прологом, но я стараюсь не идти по плохому пути и не тратить много времени в процессе.

Некоторые вопросы, которые могут помочь определить то, что я пытаюсь выяснить:

  1. Это звучит выполнимо?
  2. Я лаю не на то дерево?
  3. Есть ли недостатки или проблемы при попытке создать все эти правила во время выполнения?
  4. Есть ли лучшая система для такого рода вещей, которую я мог бы втиснуть в приложение C # (точнее, Silverlight)?
  5. Существуют ли другие конкурирующие системы, которые мне следует изучить?
  6. Есть ли у вас какие-либо общие советы по этому поводу?

Заранее спасибо за совет!


person Anthony Compton    schedule 21.07.2011    source источник
comment
Я бы изменил заголовок этого вопроса, чтобы он содержал фразу «Конфигурация продукта» или что-то в этом роде. Вы сами пишете. Загвоздка в том, что у каждого продукта есть свой набор правил, так что я думаю, что вы больше интересуетесь этой областью, чем логикой вообще.   -  person Mostowski Collapse    schedule 22.07.2011


Ответы (2)


  1. Конечно, но у Пролога есть кривая обучения.
  2. Вывод на основе правил — это игра Пролога, хотя вам, возможно, придется переписать многие правила в предложения Хорна. A+B => Q выполнимо (он становится q :- a. q :- b. или q :- (a;b).), но другие ваши примеры должны быть переписаны, включая A => ~X.
  3. Зависит от вашего компилятора Prolog, особенно от того, поддерживает ли он индексирование для динамических предикатов.
  4. Поищите такие термины, как «упреждающая проверка», «механизм логического вывода» и «бизнес-правила». Различные сообщества продолжают изобретать различные термины для решения этой проблемы.
  5. Правила обработки ограничений (CHR) — это язык логического программирования, реализованный как расширение Prolog, т.е. гораздо ближе к основанным на правилах механизмам логического вывода/прямой цепочки/бизнес-правил. Однако, если вы хотите использовать его, вам все равно придется изучить базовый Пролог.
  6. Имейте в виду, что Пролог — это язык программирования, а не панацея для логического вывода. Он срезает некоторые углы логики первого порядка, чтобы обеспечить эффективную вычислимость. Вот почему он обрабатывает только предложения Хорна: они могут быть сопоставлены один к одному с процедурами/подпрограммами.
person Fred Foo    schedule 21.07.2011

Вы также можете добавить DCG для создания списка материалов. Идея примерно состоит в том, что терминалы можно использовать для обозначения подпродуктов, а нетерминалы — для определения все более и более сложных комбинаций подпродуктов, пока вы не получите окончательные конфигурируемые продукты.

Возьмем, к примеру, две пары значений атрибутов Цвет в {красном, синем, зеленом} и Материал в {дерево, металл}. Они могут указывать на дверную ручку, при этом возможны не все комбинации:

knob(red,wood)   --> ['100101'].
knob(red,metal)  --> ['100102'].
knob(blue,metal) --> ['100202'].

Затем вы можете определить дверь как:

door ... --> knob ..., panel ...

Интересно, что в такой спецификации продукта вы не увидите никакой логической формулы, только факты и правила, и множество параметров, которые передаются. Вы можете использовать параметры в компоненте приобретения знаний. Просто запустив неконкретизированные цели, вы можете получить возможные значения для пар значений атрибутов. Предикат setof/3 отсортирует и удалит дубликаты за вас:

?- setof(Color,Material^Bill^knob(Color,Material,Bill,[]),Values).
Value = [blue, red] 
?- setof(Material,Color^Bill^knob(Color,Material,Bill,[]),Values).
Material = [metal, wood] 

Теперь вы знаете диапазон атрибутов и можете позволить конечному пользователю последовательно выбирать атрибут и значение. Предположим, он берет атрибут Color и его значение blue. Затем диапазон атрибута Материал соответственно сжимается:

?- setof(Material,Bill^knob(blue,Material,Bill,[]),Values).
Material = [metal] 

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

?- knob(blue,metal,Bill,[]).
Bill = ['100202']

Наилучшие пожелания

P.S.: О, кажется, идея со списком материалов, использованная в конфигураторе продукта, восходит к Clocksin & Mellish. По крайней мере, я нашел соответствующий комментарий здесь: http://www.amzi.com/manuals/amzi/pro/ref_dcg.htm#DCGBillMaterials

person Mostowski Collapse    schedule 21.07.2011