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

Using DCG remove non-numbers from a list

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

举个例子:

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

您可以先定义基本情况,例如:

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