在 Prolog DCG 中使用列表
Using list in Prolog DCG
我正在尝试将 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).
是否可以向我解释哪里出了问题或遗漏了什么?
谢谢!
DCG 表示法的目的正是隐藏,或者更好的是,隐式标记列表。所以,你的代码应该看起来像
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).
我正在尝试将 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).
是否可以向我解释哪里出了问题或遗漏了什么?
谢谢!
DCG 表示法的目的正是隐藏,或者更好的是,隐式标记列表。所以,你的代码应该看起来像
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).