【发布时间】:2017-03-07 16:47:46
【问题描述】:
我正在尝试将 Prolog 谓词转换为 DCG 代码。即使我熟悉语法语言,我也很难理解 DCG 如何处理列表以及我应该如何使用它。
其实这是我的谓词:
cleanList([], []).
cleanList([H|L], [H|LL]) :-
number(H),
cleanList(L, LL),
!.
cleanList([_|L], LL) :-
cleanList(L, LL).
这是一个删除非数字元素的简单谓词。 我希望在 DCG 中写入相同的行为。
我尝试了类似的方法(显然不起作用):
cleanList([]) --> [].
cleanList([H]) --> {number(H)}.
cleanList([H|T]) --> [H|T], {number(H)}, cleanList(T).
是否可以向我解释什么是错的或缺少什么?
谢谢!
【问题讨论】:
-
一个大问题是
... --> [H|T], ...。您希望 DCG 读取序列并且[H|T]具有任意长度。不知道为什么您在该术语中包含T。您对cleanList(T)的递归调用已经在输入上扫描T。 -
哦,是的,我明白了!谢谢你的回复,我不明白DCG是如何递归读取序列的,现在可以了。