在序言中查找所有内容
Find all in prolog
我有一些员工:
employee(2,2,'George','Johnson','12/16/1987').
employee(4,3,'Noah','Jones','6/9/1984').
employee(5,4,'Jack','Brown','2/16/1992').
employee(6,6,'Charlie','Davis','3/28/1997').
employee(7,1,'Leo','Miller','6/6/1997').
employee(8,6,'Jacob','Wilson','2/16/1997').
我想打印所有这些。我现在这样做:
run :- findall(Id, employee(Id, _, _, _, _), L), writeEmployees(L).
writeEmployees([]) :- !.
writeEmployees([Id|T]) :- employee(Id, PosId, FN, LN, Birth),
writeq(employee(Id, PosId, FN, LN, Birth)), nl, writeEmployees(T).
它有效,但它看起来不太好,我的意思是,'_' 太多了,我必须写 'Id, PosId, FN, LN, Birth' 字符串。如何在findall()中直接找到员工?
你所拥有的并没有什么大错。是的,您有四个 _
,但如果您不关心这 4 个参数中的任何一个,那也没关系。
但是,您将跳过这些参数,然后稍后再检索它们。如果你想避免这种情况,你可以编写 findall
来捕获你想要的所有内容,然后用 maplist
.
写出该列表
run :-
findall(employee(Id, PosId, FN, LN, Birth),
employee(Id, PosId, FN, LN, Birth), Employees),
writeEmployees(Employees).
writeEmployee(E) :- writeq(E), nl.
writeEmployees(Es) :- maplist(writeEmployee, Es).
不过,最终这取决于它可能适合的更广泛的应用。如果您在更广泛的案例中管理员工,那么通过 Id
管理他们,然后仅在需要时才检索详细信息,就像您目前拥有的那样,确实更有效。不过,您可以将当前的 writeEmployees
重写为 maplist
:
writeEmployee(Id) :-
employee(Id, PosId, FN, LN, Birth),
writeq(employee(Id, PosId, FN, LN, Birth)), nl.
writeEmployees(EmployeeIds) :-
maplist(writeEmployee, EmployeeIds).
我有一些员工:
employee(2,2,'George','Johnson','12/16/1987').
employee(4,3,'Noah','Jones','6/9/1984').
employee(5,4,'Jack','Brown','2/16/1992').
employee(6,6,'Charlie','Davis','3/28/1997').
employee(7,1,'Leo','Miller','6/6/1997').
employee(8,6,'Jacob','Wilson','2/16/1997').
我想打印所有这些。我现在这样做:
run :- findall(Id, employee(Id, _, _, _, _), L), writeEmployees(L).
writeEmployees([]) :- !.
writeEmployees([Id|T]) :- employee(Id, PosId, FN, LN, Birth),
writeq(employee(Id, PosId, FN, LN, Birth)), nl, writeEmployees(T).
它有效,但它看起来不太好,我的意思是,'_' 太多了,我必须写 'Id, PosId, FN, LN, Birth' 字符串。如何在findall()中直接找到员工?
你所拥有的并没有什么大错。是的,您有四个 _
,但如果您不关心这 4 个参数中的任何一个,那也没关系。
但是,您将跳过这些参数,然后稍后再检索它们。如果你想避免这种情况,你可以编写 findall
来捕获你想要的所有内容,然后用 maplist
.
run :-
findall(employee(Id, PosId, FN, LN, Birth),
employee(Id, PosId, FN, LN, Birth), Employees),
writeEmployees(Employees).
writeEmployee(E) :- writeq(E), nl.
writeEmployees(Es) :- maplist(writeEmployee, Es).
不过,最终这取决于它可能适合的更广泛的应用。如果您在更广泛的案例中管理员工,那么通过 Id
管理他们,然后仅在需要时才检索详细信息,就像您目前拥有的那样,确实更有效。不过,您可以将当前的 writeEmployees
重写为 maplist
:
writeEmployee(Id) :-
employee(Id, PosId, FN, LN, Birth),
writeq(employee(Id, PosId, FN, LN, Birth)), nl.
writeEmployees(EmployeeIds) :-
maplist(writeEmployee, EmployeeIds).