序言:将列表中的所有原子都小写

Kri*_*ack 2 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]).
Run Code Online (Sandbox Code Playgroud)

追加使用[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).
Run Code Online (Sandbox Code Playgroud)

我对Prolog还是很陌生(目前我将自己归类为Lisp程序员),所以很可能我缺少基本知识。救命?

gus*_*bro 5

如果您已经有了原子列表,则要缩小它们的大小,必须使用maplist/3和映射downcase_atom/2

downcase_list(AnyCaseList, DownCaseList):-
  maplist(downcase_atom, AnyCaseList, DownCaseList).
Run Code Online (Sandbox Code Playgroud)