2016-12-05 82 views
3

我正在学习Prolog,并且在课程中练习说要擦除列表中的每个原子元素,这可能是一个重叠列表。 如果我有序列列表中的空列表

clean([1,[2,[3],4],5],L). 

应该成为

L = [[[]]] 

如何能不能做到?

回答

0

解决这个问题的方法是通过每个你可能遇到的列表来思考。例如,如果您遇到空列表,那么答案是什么?答案只是空的列表。

clean([],[]). 

现在,如果第一个元素是一个原子(不是另一个列表)呢?然后我们删除元素 - 这意味着我们不会将它添加到结果列表中。

clean([H|T],L):- \+ is_list(H), clean(T,L). 

最后,如果第一个元素是另一个列表呢?然后,我们将清单添加到答案中,但只有在清洁后。将它添加到答案列表的方式是通过“预先挂起”它作为答案列表的头部,因此“[Empty | L]”。

clean([H|T],[Empty|L]):- is_list(H), clean(H,Empty), clean(T,L). 

把上面的条款放在一起写在一个程序中,这就是你的答案。