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