Итак, я пытаюсь
Я определяю наборы с помощью is_a(b, a), is_a(c, a)
, который для простоты визуально будет выглядеть примерно так:
a
b c
d e f g
Я хочу дать в списке [b, c]
и в результате получить список [d, e, f, g]
В тот момент, когда я даю node
или переменную, он может найти все, что находится под ним, с помощью этого метода:
find_nodes(Root, Root) :-
\+ is_a(_, Root).
find_nodes(Root, X) :-
is_a(Node, Root),
find_nodes(Node, X).
Что при запуске дает мне результат, который мне нужен:
?- find_nodes(b, X).
X = d.
X = e.
Но его нет в списке, поэтому я попробовал:
?- all_nodes([b, c], X).
all_nodes([], _).
all_nodes([H|T], [R|Res]):-
findall(L, find_nodes(H, L), R),
all_nodes(T, Res).
Что дает мне - X = [[d, e], [f, g]|_4040]
, который состоит из списков в списках, но мне нужен только 1 список, который будет X = [d, e, f, g]
.
Что я здесь не так делаю?
EDIT
Как сказал @lurker findall
возвращает список, и добавление списка в список даст результат, который я получаю прямо сейчас.
Я также попробовал использовать одну вещь:
all_nodes([], _).
all_nodes([H|T], [R|Res]):-
find_nodes(H, R),
all_nodes(T, Res).
Но хорошо, что он тоже не работает, потому что он дает мне только 1 элемент, который в данном случае равен d
, а затем f
.