使用 DCG 从列表中删除非数字
Using DCG remove non-numbers from a list
我需要在 Prolog 中编写一个谓词 CleanList/3
,方法是使用 dcg 解析一个列表,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].
我需要在 Prolog 中编写一个谓词 CleanList/3
,方法是使用 dcg 解析一个列表,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
.
示例:
?- 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].