【问题标题】:Using DCG remove non-numbers from a list使用 DCG 从列表中删除非数字
【发布时间】:2017-08-03 17:43:43
【问题描述】:

我需要使用 在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,[]),!.

【问题讨论】:

  • 您的基本案例不是 DCG,也不是基本案例。基本情况不是递归的,但应该给出基本的、最低级别的关系。您的递归调用使用 3 个参数作为谓词,该谓词只需要 2 个。
  • 只有当X 是一个数字时,您才能使用number(X) 成功这一事实。

标签: dcg prolog dcg


【解决方案1】:

您可以从定义基本情况开始,例如:

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

【讨论】:

  • 谢谢!有什么方法可以改变它以使 cleanListDCG/3 在从 cleanList/2 调用时正常工作?
  • 是的,只需将上面的内容重命名为 cleanlistDSG 并添加新规则:cleanlist(L,L1):-phrase(cleanlistDCG(L),L1)。这是所要求的 cleanlist/2 谓词....
猜你喜欢
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
  • 2012-09-25
  • 1970-01-01
相关资源
最近更新 更多