Использование predicate append/2
:
?- L = [[[a,b],[d,e]],[[m,f],[p,o]],[[r,l],[v,d]]], append(L, R).
L = [[[a, b], [d, e]], [[m, f], [p, o]], [[r, l], [v, d]]],
R = [[a, b], [d, e], [m, f], [p, o], [r, l], [v, d]].
Вы должны смотреть at the implementation by SWI-Prolog и скопировать его, если вам нужно. Оставьте must_be/2
, если вы должны сделать это в GNU-Prolog.
Но если вам нужно это из-за findall/3
, имейте в виду, что также может быть findall/4
доступны (не для GNU-Пролога, но SWI-Prolog имеет его):
$ swipl
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.2-25-gf8c39d8)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.
For help, use ?- help(Topic). or ?- apropos(Word).
?- findall(X, between(1,3,X), Xs, Rest), findall(Y, between(7,11,Y), Rest).
Xs = [1, 2, 3, 7, 8, 9, 10, 11],
Rest = [7, 8, 9, 10, 11].
Почти каждая ситуация, когда вам нужно сгладить список, которого можно было бы избежать, используя списки различий.
Отметьте этот вопрос. http://stackoverflow.com/questions/27263004/flattening-only-one-level-of-a-list-in-prolog – vmg
Вы хотите написать * предикат * (правило Пролога), а не * функцию *. В Prolog нет функций. :) Вопрос также оставляет некоторые вопросы. Например, может ли исходный список иметь более 3 уровней списков? И если да, то какие уровни вы хотите удалить? Что делать, если исходный список имеет только 1 или 2 уровня? Если это не удастся? Или получить исходный список? Или что-то другое? – lurker
контекст в том, что я использую предикат findall, и в результате он дает мне этот список, который я буду использовать в другом предикате, проблема в том, что findall дает мне этот список, который всегда будет 3 уровня. –