我正在尝试编写一个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程序员),所以我很可能会错过一些基本的东西。帮助
答案 0 :(得分:4)
如果您已经有一个原子列表,要对它们进行缩写,您必须应用maplist/3
和downcase_atom/2
的映射:
downcase_list(AnyCaseList, DownCaseList):-
maplist(downcase_atom, AnyCaseList, DownCaseList).