Вы запросили все элементы списка списков. То есть для [[1,2,3],[4]]
это будет список [1,2,3,4]
. Однако для [[[1],[3]]]
это будет список [[1],[3]
, так как [1]
и [3]
являются элементами. По этой причине flatten/2
неверен, он дает вам [1,3]
в качестве ответа. Кроме того, для 1
это дает [1]
...
Вот решение, использующее dcg:
seq([]) --> [].
seq([E|Es]) --> [E], seq(Es).
seqq([]) --> [].
seqq([Es|Ess]) --> seq(Es), seqq(Ess).
?- phrase(seqq([[[1],[3]]]), Xs).
Xs = [[1],[3]].
?- phrase(seqq(1), Xs).
false.
Это решение теперь работает и в тех случаях, как следующее:
?- phrase(seqq([S1,S2]), [1,2]).
S1 = [],
S2 = [1,2] ;
S1 = [1],
S2 = [2] ;
S1 = [1,2],
S2 = [] ;
false.
В то время как flatten/2
полностью неправильный:
?- flatten([S1,S2],[1,2]).
S1 = 1,
S2 = 2.
исследовательская панель + «сгладить» должно сделать вас счастливым. – m09