Можно ли использовать pyDatalog для проверки всех зависимостей данных?

Я пытаюсь использовать pyDatalog, чтобы определить, удовлетворены ли зависимости для различных функций. Некоторые библиотеки (lA,lB,...) предоставляют выходные данные (1,2,...), необходимые для функций (fX,fY,...).

Например:

+has("lA", 1)   #Library A has output 1
+has("lA", 2)   #Library A has output 2
+has("lB", 2)   #Library B has output 2
+needs("fX", 1) #Feature X needs output 1
+needs("fX", 2) #Feature X needs output 2
+needs("fY", 2) #Feature Y needs output 2

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

lib_supports_feature(X, Z) <= has(X, Y) & needs(Z, Y)
lib_supports_feature(X,"fX")

Это возвращает: [('lA',), ('lB',)], потому что он просто находит любую библиотеку, по крайней мере, с одним путем к функции.

Есть ли хороший способ вернуть только те библиотеки, которые соответствуют всем потребностям этой функции, используя pyDatalog?


person kerblogglobel    schedule 02.04.2015    source источник


Ответы (2)


Вам нужно использовать двойное отрицание:

missing(X,Y,Z) <= ( # Y is a missing output of X, and is needed by Z
               needs(Z, Y) 
               & has(X, Y1) # needed only if X is not bound
               & ~ has(X, Y))

lib_full_supports_feature(X,Z) <= ( # like supports, but there is no missing output
               has(X,Y) 
               & needs(Z,Y) 
               & ~ missing(X, Y1, Z))
person Pierre Carbonnelle    schedule 02.04.2015

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

(lib_num_supported_and_needed_features[X, Z] == len_(Y)) <= (has(X, Y) & needs(Z, Y))
(num_needed_features[Z] == len_(Y)) <= (needs(Z, Y))
lib_full_supports_features(X, Z) <= (num_needed_features[Z] == lib_num_supported_and_needed_features[X, Z])
person chris elgoog    schedule 06.07.2015