0

此 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 库(列表)的情况下尝试它。谢谢..

4

1 回答 1

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将从事实数据库中调用每个人并检查该人是否在累加器列表中。如果它找到一个这样的人,那么它会递归地调用自己将这个人添加到累加器中。如果它没有找到任何不在输入列表中的人,那么它将这个累加器与输出的人员列表统一起来。

于 2012-12-06T13:55:55.230 回答