DLV에서 규칙에있는 모든 조건 자의 요소가있는 목록을 만드는 방법이 있는지 궁금합니다. 예를 들어, 내가 가지고있는 경우 다음과 같은 조건DLV 목록 구성
foo(a, b).
foo(a, c).
foo(a, e).
foo(b, c).
첫 번째 요소는 foo
의 첫 번째 매개 변수와 관련된 모든 요소 목록을 포함해야 두 번째 매개 변수는 내가해야 새로운 조건을 찾고 결과 최초의 파라미터 경험적 :
bar(a, [b,c,e]).
bar(b, [c]).
내가 거기에 알고는 다음 코드를 사용하여 이러한 결과를 (플러스 더 많은) 얻기의 방법은 다음과 같습니다
bar(A, [X]) :- foo(A, X).
bar(A, P) :- bar(A, P0),
foo(A, X),
not #member(X, P0),
#insLast(P0, X, P).
하지만 난을 예방하는 방법이 있는지 알고 싶습니다 가능한 모든 크기 목록을 1에서 N까지 생성합니다 (최종 목록의 요소 수 N). 나는 두 가지 이유로 그것을하고 싶다. (1) 계산 비용을 줄인다. (2) 모든 불필요한 술어를 버리는 것을 막는다. 계산 비용이 경우 될 수있는 문제가 아니었다면
, 나는 가장 큰 목록 만 술어 유지하기 위해 다음과 같이 변경을 생각했다 그러나
tmp_bar(A, [X], 1) :- foo(A, X).
tmp_bar(A, P, L) :- tmp_bar(A, P0, L0),
foo(A, X),
not #member(X, P0),
#insLast(P0, X, P),
L = L0 + 1.
bar(A, P) :- tmp_bar(A, P, L),
max_list(A, L).
max_list(A, L) :- foo(A, _),
#max{X: tmp_bar(A, P, X)} = L.
을,이에 시작 복잡 해지고 최대 크기의 목록을 모두 표시하고있을뿐만 아니라 그 중 하나를 표시합니다. 어떻게 하나를 제외한 모든 것을 없앨 수 있습니까? 나는 막대 (A, P)를 다른 막대 (A, _)가없는 경우에만 생성하려고 시도했지만 "규칙은 안전하지 않습니다". 또한 발생 횟수 및 유사한 문제를 계산하는 시도가 나타났습니다 ...
가장 중요한 것은 많은 트릭없이 한꺼번에 모든 결과를 얻을 수 있습니까?
도움이 되셨다면
감사합니다.