Prolog:将列表中的所有原子放下

时间:2013-04-30 17:26:44

标签: list prolog swi-prolog

我正在尝试编写一个Prolog程序,该程序需要使用用户的自然语言输入并将其与一组原子匹配。我正在使用SWI Prolog的readln/1来获取输入并将其放入原子列表中,但我不保证用户输入的情况,所以我想简单地将所有输入都放在一边在我尝试匹配之前得到。我现在拥有的是:

downcase_list(AnyCase, LowerCase) :- dcl(AnyCase, X), flatten(X,LowerCase).

dcl([], List) :- List.
dcl([Head|Rest], []) :- downcase_atom(Head,X), dcl(Rest,X).
dcl([Head|Rest], List) :- downcase_atom(Head,X), dcl(Rest, [List|X]).

使用[List|X]添加似乎是我的问题,但我不知道如何修复它,因为我已经尝试使用append/3并且只是有一个无限循环:

downcase_list([], List) :- List.
downcase_list([Head|Rest], []) :- downcase_atom(Head,X), downcase_list(Rest, X).
downcase_list([Head|Rest], NewList) :- downcase_atom(Head,X), append(NewList,X,Z), writeln(Z), downcase_list(Rest,Z).

我是Prolog的新手(我现在将自己归类为Lisp程序员),所以我很可能会错过一些基本的东西。帮助

1 个答案:

答案 0 :(得分:4)

如果您已经有一个原子列表,要对它们进行缩写,您必须应用maplist/3downcase_atom/2的映射:

downcase_list(AnyCaseList, DownCaseList):-
  maplist(downcase_atom, AnyCaseList, DownCaseList).