2016-09-23 6 views
0

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, _)가없는 경우에만 생성하려고 시도했지만 "규칙은 안전하지 않습니다". 또한 발생 횟수 및 유사한 문제를 계산하는 시도가 나타났습니다 ...

가장 중요한 것은 많은 트릭없이 한꺼번에 모든 결과를 얻을 수 있습니까?

도움이 되셨다면

감사합니다.

답변

0

분명히 특정 순서로 요소를 추가하여 문제에 대한 해결책을 찾았습니다. 내가하는 일은 현재 목록의 마지막 요소보다 작은 경우에만 목록 끝에 요소를 추가하는 것입니다. 나는 숫자가 아닌 이름을 다루고 있었으므로 이것이 가능하지는 않았지만).

tmp_bar(A, [X], 1) :- foo(A, X). 
tmp_bar(A, P, L) :- tmp_bar(A, P0, L0), 
         foo(A, X), 
         #last(P0, Y), 
         Y < X, 
         #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. 

이 미래에 다른 사람을 도움이되기를 바랍니다 : 여기에

는 코드입니다.