使用DCG从列表中删除非数字

时间:2017-03-13 16:04:11

标签: prolog dcg

我需要在Prolog中编写谓词CleanList/3,使用解析列表并返回一个具有相同数字的新列表,但所有不是数字的元素都被删除。

举个例子:

?- 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,[]),!.

1 个答案:

答案 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].