У нас есть пул предметов.Каждый предмет имеет набор характеристик.Каждая характеристика представляет собой строку, целое число или число с плавающей точкой.Каждый элемент также имеет определенный тип.Типы являются иерархическими.
У нас также есть набор корзин.У каждого бина есть требование, которое является логическим выражением, состоящим из атомарных выражений, касающихся характеристик элемента.Этими атомарными выражениями могут быть сравнения строк, целых чисел или операций с плавающей запятой и сравнения типов.
Мы хотим поместить элементы в ячейки так, чтобы каждый элемент, помещенный в ячейку, удовлетворял требованию этой ячейки.Каждая корзина также должна содержать определенное количество элементов.
Например, у нас может быть следующая иерархия типов:
- shape
- треугольник
- равносторонний треугольник
- прямоугольник
У нас могут быть следующие предметы:
- LargeRedTriangle
- type = треугольник
- color = "red"
- area = 1000
SmallShape
LargeBlueSquare
- тип = квадрат
- цвет= "синий"
- area = 2000
Вот пример корзины:
- LargeRectangles
- (type == прямоугольник) и (область> 750)
- количество элементов = 5
Мы можем поместить LargeBlueSquare в корзину LargeRectangles.Мы хотим ровно 5 элементов в этой корзине.
Вот еще один пример корзины:
- NonBlueTriangles
- (type == треугольник) и (не (color ==)"синий"))
- количество элементов = 10
LargeRedTriangle может помещаться в корзину NonBlueTriangles.Мы хотим ровно 10 элементов в этой корзине.
Итак, у нас есть набор предметов и набор корзин.Вопрос состоит в том, чтобы выяснить, сколько существует способов поместить элементы в ячейки при соблюдении ограничений (то есть требований к элементам в ячейках и количества элементов в каждой ячейке).(Нам не нужно перечислять все способы сделать это; нам нужно только знать, сколько существует различных способов сделать это.)
Существует ли эффективный способ определения этого числа?Или нам просто нужно «перебить» его и попробовать все возможные комбинации?