我正在尝试将一个Prolog谓词转换为DCG代码。即使我熟悉语法语言,我仍然有些困难理解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
。 - lurker