使用Prolog DCG中的列表



我正在尝试将prolog谓词转换为DCG代码。即使我熟悉语法langage,我也会遇到一些麻烦,可以理解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).

有可能向我解释什么错或缺少什么?

谢谢!

dcg符号的目的完全是 hide ,或者更好,使隐范列表。因此,您的代码应该看起来像

cleanList([]) --> [].
cleanList([H|T]) --> [H], {number(H)}, cleanList(T).
cleanList(L) --> [H], {+number(H)}, cleanList(L).

可以提高效率:

cleanList([]) --> [].
cleanList([H|T]) --> [H], {number(H)}, !, cleanList(T).
cleanList(L) --> [_], cleanList(L).

样式注意:prologgers确实更喜欢避免骆驼:)

clean_list([]) --> [].
etc...

另外,我更喜欢更紧凑的代码:

clean_list([]) --> [].
clean_list(R) --> [H], {number(H) -> R = [H|T] ; R = T}, clean_list(T).

最新更新