在不使用Prolog中的pl列表库的情况下将元组添加到列表中

时间:2012-12-06 05:41:22

标签: prolog

这个showName查询将给出一组名称:

?- showName(SName,Fname).
SName = 'McBrien',
FName = 'Alex' ;
SName = 'Gardner',
FName = 'Daniel' ;
SName = 'Phillips',
FName = 'Abbas' ;
SName = 'Pietzuch',
FName = 'Paul'  

and so on as I keep pressing ; it will gives more names.

我需要编写另一个名为

的函数
nameList (List). %which will put all names by query showName into List as a tuple
                  ((SName1,FName1),(SName2,FName2), ... )

我想在不使用Prolog库(列表)的情况下尝试它。 感谢..

1 个答案:

答案 0 :(得分:1)

假设您的事实数据库类似于

person('Alex', 'McBrien', male).
person('Daniel', 'Gardner', male).
person('Abbas', 'Phillips', male).
person('Paul', 'Pietzuch', male).

没有重复,你可以通过累加器不使用findall/3来实现,但需要额外的计算成本。只有在尚未成为累积器的成员时才需要将它添加到累加器:

nameList(List):-
  nameList([], List).

nameList(IList, List):-
  (
   call(person(FName, SName, _)),
   \+ (member((SName, FName), IList))
  )-> nameList([(SName, FName)|IList], List) ; List=IList.

过程nameList/1只使用空累加器调用nameList/2。 然后,程序nameList/2将从事实数据库中调用每个人,并检查该人是否在累加器列表中。如果它找到一个这样的人,那么它递归地调用自己将此人添加到累加器。如果它没有找到任何不在输入列表中的人,那么它会将此累加器与输出人员列表统一起来。