2013-12-14 10 views
2

나는 쌍 목록의 요소를 추출하려고 시도하고 있지만 쌍만 액세스 할 수 있습니다. 다음과 같은 목록이있는 경우 :목록 내부의 사실에 액세스하는 방법

list([p(a,b),p(c,d)]). 

어떻게 a, b, c, d 요소에 액세스 할 수 있습니까? 예를 들어 다음을 실행하는 경우 :

list_s(X) :- list(L), member(X,L). 

?- list_s(X). 
X = p(a,b), 
X = p(c,d) 

모든 목록이 목록에 표시됩니다. 하지만 규칙을 작성하려고합니다.

listSelect(X) :- list(X), (... something). 

?- listSelect(X). 
X = a, 
X = b, 
X = c, 
X = d 

이런 식으로 규칙을 수립 할 수 있습니까?

답변

1

루벤스 '대답은 완벽하게 괜찮습니다, 그러나, 경우 주문이 중요하다면 다음과 같이 쓸 수도 있습니다.

list_select(X) :- 
    list(L), 
    member(p(A,B), L), 
    ( X = A 
    ; X = B 
    ). 

As 작은 보너스는 원래 목록을 한 번만 탐색합니다. 당신이 임의의 인수에 대응와 펑에이 일을하고 싶었

대신 쓸 수있다 :

list_select(X) :- 
    list(L), 
    member(F, L), 
    F =.. [_N|Args], 
    member(X, Args). 
0

당신은 단순히 같이 목록의 가능한 사실을 통해 실행할 수 있습니다 :주는

list([p(a, b), p(c, d)]). 
listSelect(X) :- list(L), member(p(X, _), L). 
listSelect(X) :- list(L), member(p(_, X), L). 

:

?- listSelect(A). 
A = a ; 
A = c ; 
A = b ; 
A = d. 
관련 문제