我需要在Prolog中编写谓词CleanList/3
,使用dcg解析列表并返回一个具有相同数字的新列表,但所有不是数字的元素都被删除。
举个例子:
?- cleanList([1,2,d,67,3.2,'CSI2120',foo,5],LL).
LL = [1, 2, 67, 3.2, 5].
我编写了基本案例并努力用递归案例实现DCG。有人可以帮我这个吗?
基本案例:
cleanList(L,LL) :- cleanList(LL,L,[]),!.
答案 0 :(得分:0)
您可以从定义基本案例开始,如:
cleanlist([]) --> [].
这很简单,当cleanlist/1
的参数为空列表时,它只返回空列表。
您还可以定义子句:
cleanlist([H|T]) --> ( {number(H)} -> [H], cleanlist(T) ; cleanlist(T) ).
如果它是一个数字并且递归调用cleanlist/1
,那么保留列表H的头部。
示例:
?- phrase( cleanlist([1]) ,L ).
L = [1].
?- phrase( cleanlist([1,3]) ,L ).
L = [1, 3].
?- phrase( cleanlist([1,2,a,c,3]) ,L ).
L = [1, 2, 3].
?- phrase( cleanlist([1,2,a,c,3,m,k,l,o,"ABC",12]) ,L ).
L = [1, 2, 3, 12].
?- phrase( cleanlist([a,b]) ,L ).
L = [].
?- phrase( cleanlist([A,1,b]) ,L ).
L = [1].