代码之家  ›  专栏  ›  技术社区  ›  Thelouras hepizoj

序言,打印同名员工

  •  1
  • Thelouras hepizoj  · 技术社区  · 7 年前

    这是我第一次使用Prolog。

     employee(eID,firstname,lastname,month,year).
    

    我有以下单位:

     unit(uID,type,eId).
    

    我想做一个谓词

    double_name(X).
    

    打印X单元中同名员工的姓氏。

    我正在做这样的事情:

    double_name(X) :- 
      unit(X,_,_eID),
      employee(_eID,_firstname,_,_,_),
      _name = _firstname,
      employee(_,_name,_lastname,_,_),
      write(_lastname).
    

    但它会打印出单位里的所有员工。

    如何仅打印同名员工?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Guy Coder    7 年前
    unit(unit_01,type,1).
    unit(unit_01,type,2).
    unit(unit_01,type,3).
    
    employee(1,mary,smith,6,1992).
    employee(2,fred,jones,1,1990).
    employee(3,mary,cobbler,2,1995).
    
    double_name(Unit) :-
      unit(Unit,_,Eid_1),
      employee(Eid_1,Firstname,Lastname_1,_,_),
      unit(Unit,_,Eid_2),
      Eid_1 \= Eid_2,
      employee(Eid_2,Firstname,Lastname_2,_,_),
      write(Firstname),write(","),write(Lastname_1),nl,
      write(Firstname),write(","),write(Lastname_2).
    

    Prolog中的变量通常以大写字母开头,但允许以和下划线开头,但不典型。

    double_name/2 谓词类似于

    unit(Unit,_,Eid_1) 
    employee(Eid_1,Firstname,Lastname_1,_,_)
    

    用于将事实中的值加载到变量中,同时模式匹配(通过统一)绑定变量与事实匹配。

    确保一个人不与自己比较。

    Eid_1 \= Eid_2
    

    为了确保两个人的名字相同,使用了相同的变量: Firstname .

    write/1 nl/0

    例子:

    ?- double_name(unit_01).
    mary,smith
    mary,cobbler
    true ;
    mary,cobbler
    mary,smith
    true ;
    false.
    

    见: Prolog check if first element in lists are not equal and second item in list is equal

    normalize/4 setof/3 在我的 answer

    我把它留给你做练习。

    推荐文章