Поскольку @false уже указано [ ]
это не пробел, а пустой список. Также ваш предикат описывает L
как Head
минус пустой список, и он не заботится о результате рекурсии (deleteAll(Tail,_)
). Вот почему вы получаете неизменный первый список в качестве результата.
Подумайте о том, что предикат должен описать: отношение между двумя списками списков, где второй список содержит подсписки первого списка без пространства, за исключением самого последнего подсписка, что неизменна:
:- set_prolog_flag(double_quotes, chars).
lists_withoutspace([X],[X]). % last list unaltered
lists_withoutspace([H1,H2|T1],[H1WoS|T2]) :- % H1Wos:
list_withoutspace(H1,H1WoS), % first sublist without spaces
lists_withoutspace([H2|T1],T2). % the same for the rests
для list_withoutspace/2 можно использовать тэ встроенный предикат char_type/2, чтобы определить тип первого списка-элемента:
list_withoutspace([],[]). % empty list contains no space
list_withoutspace([X|T],L) :- % X is not in the list
char_type(X,space), % if it is space
list_withoutspace(T,L). % relation must also hold for tail
list_withoutspace([X|T],[X|L]) :- % X is in the list
char_type(X,alpha), % if it is a letter
list_withoutspace(T,L). % relation must also hold for tail
Если вы хотите, чтобы соответствовать более чем буквы изменить alpha
соответственно. Если вы запрашиваете этот предикат, вы получите желаемый результат:
?- lists_withoutspace([[q,' ',w,' ',e,' ',r,' ',t,' ',z],[a,' ',s,' ',d,' ',f,' ',g,' ',h],[y,' ',x,' ',c,' ',v,' ',b,' ',n]],L).
L = [[q,w,e,r,t,z],[a,s,d,f,g,h],[y,' ',x,' ',c,' ',v,' ',b,' ',n]] ? ;
no
Или более компактно:
?- lists_withoutspace(["q w e r t z","a s d f g h","y x c v b n"],L).
L = [[q,w,e,r,t,z],[a,s,d,f,g,h],[y,' ',x,' ',c,' ',v,' ',b,' ',n]] ? ;
no
Как вы представляете пространства? Вам нужно написать '' ''! – false