Использование findall для создания списка списков - PullRequest
0 голосов
/ 26 апреля 2018

Моя цель - распечатать список списков, содержащий результаты запроса. solution определяется

solution(G, T) :- comb(G, T), allPos(T, G), not(cycle(T)), writeln(T), false.

и вывод выглядит так:

?- solution([a-b,a-c,a-d,b-c,c-d],X0).
[c-d]
[c-d]
[c-d]
[b-c]
[b-c]
[b-c]
[b-c,c-d]
[b-c,c-d]
[b-c,c-d]
[b-c,c-d]
[b-c,c-d]
.
.
.(etc...)

То, что я создал до сих пор, выглядит так:

findall_call(Input, X) :-
  findall(X0, solution(Input, X0), X).

, который преобразует вывод solution(...) в следующую форму:

?- findall_call(X0, solution([a-b,a-c,a-d,b-c,c-d],X0), X).
[c-d]
[c-d]
[c-d]
[b-c]
[b-c]
[b-c]
[b-c,c-d]
[b-c,c-d]
[b-c,c-d]
.
.
.
X = [].

Так что да, то же самое с X = []. в конце. Ожидаемый результат должен выглядеть как список списков:

[[c-d],[c-d],[c-d],[b-c],[b-c],[b-c],[b-c,c-d],[b-c,c-d],[b-c,c-d]...]

Есть идеи, почему это так странно работает? Я чувствую, что роль , writeln(T), false. не очень хорошая идея. Я объясняю это тем, что не хочу многократно использовать точку с запятой для получения ответов на все прологи. Когда я удаляю эту часть, вывод:

?- findall_call(X0, solution([a-b,a-c,a-d,b-c,c-d],X0), X).
X = [[c-d], [c-d], [c-d], [b-c], [b-c], [b-c], [b-c, ... - ...], [... - ...|...], [...|...]|...].

что, очевидно, не является моей целью.

Как мне переделать свой код, чтобы получить полный список списков

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...