0

我有一些员工:

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

1 回答 1

1

你所拥有的并没有什么大错。是的,你有四个_,但如果你不关心这四个参数中的任何一个,那也没关系。

但是,您将跳过这些参数,然后稍后再检索它们。如果你想避免这种情况,你可以写你的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).
于 2019-12-07T15:50:31.817 回答