Как проверить ограничения между элементами в списке / это ограничение программирования? - PullRequest
6 голосов
/ 08 сентября 2010

У меня есть много списков переменного размера, содержащих экземпляры одного и того же класса с атрибутом foo, и для каждого списка я должен применять правила, такие как:

  • , если есть элемент foo = A, не может быть элементовс foo в [B, C, D]
  • , если есть элемент foo = X, должен быть хотя бы один с foo в [Y, Z]
  • , может быть между MIN и MAXelements foo = BAR

, объединяющий три вышеупомянутых правила, вероятно, достаточно, чтобы выразить любое подобное ограничение, которое мне когда-либо понадобится.Это что-то вроде проверки зависимостей в программных пакетах, но у меня есть количества и не хватает версий:)

Наивный подход был бы:

R_CONFLICT={ A: [B,C,D] }
R_DEPENDS ={ X: [ [Y,Z], W, .. } # means: A depends on either Y or Z, and W
R_MIN     ={BAR: n, BAZ: m}
R_MAX     ={BAR: o, BAZ: p}
# now just loop over lists to check them..

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

Для чего бы я ни был, я пишу код на Python, но я приветствую общий ответ по программированию :) Если окажется, что я должен вникнуть в программирование с ограничениямиЯ, вероятно, начну с попытки python-constraint .

1 Ответ

4 голосов
/ 13 сентября 2010

Краткий ответ - да, это можно проверить с помощью программирования ограничений, в сущности, вы предоставляете решение и проверяете его на соответствие ограничениям, а не решаете поиск по областям потенциалов для соответствующего решения.Что делает программирование ограничений чрезмерным, особенно если вы используете Python, который может довольно легко проверить такие условия.

У меня нет Python на этой машине, поэтому в этом коде может быть опечатка / ошибкано он показывает, что вам нужно, без необходимости заниматься программированием ограничений.

conflict = set([B, C , D])
foos = set([x.foo for x in list])
if A in foos:
    if len(foos & conflict): #Set intersection
         return false

len([x for x in list where x.foo == BAR]) #Gives you number of occurances of BAR

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

...