2013-12-14 4 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. 
Смежные вопросы