由於@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
如果你想匹配多個字母改變alpha
相應
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
:對於list_withoutspace/2,你可以使用TE內部謂詞char_type/2來確定第一列表元素的類型。如果您查詢此斷言,你得到期望的結果:
?- 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