查询列表的每个元素

时间:2013-05-04 15:34:16

标签: prolog artificial-intelligence

我正在为AI课做作业,我正在写一个prolog程序。

我应该拿一份名单并检查名单中的每个人是否属于所选择的特定国家。

到目前为止我有什么

% facts
person(bruce, australia, rhodri, bronwyn).
person(rhodri, newyork, dan, mary).
person(bronwyn, miami, gar, roo).
person(dan, miami, george, mimi).
person(mary, texas, mack, tiki).
person(gar, jamaica, zid, rem).
person(roo, newzealand, john, jill).

person(tom, mayday, dick, mel).
person(dick, newyork, harry, rin).
person(mel, miami, tom, stacey).
person(harry, miami, george, mimi).
person(rin, texas, mack, tiki).
person(tom, jamaica, zid, rem).
person(stacey, newzealand, john, jill).

% rules

eligible(P,C) :-
   person(P, C, F, M) , !
 ; person(F, C, Newfather, Newmother), !
 ; person(M, C, Newfather, Newmother), !
 ; person(Newfather, C, Grandfather , Grandmother), !
 ; person(Newmother, C, Grandfather, Grandmother).

checkteam([] , C). 
checkteam([H|T] , C) :- eligible(H, C) , checkteam(T, C).

最后两行特别是我遇到了问题,我试图用qualified()函数测试列表的每个成员然后让尾部的第一个元素成为头部并重复。

我无法找到测试每个成员的方法,如果所有成员都不符合条件,则显示失败,如果所有成员都属于该国家,则显示失败。

提前致谢。

编辑:正在愚弄并改变代码一点,结果

?- checkteam([bruce, dan], mayday).
true.

尽管布鲁斯或丹都不是来自五月天或任何父母或祖父母。

1 个答案:

答案 0 :(得分:1)

你的eligible谓词对我没有意义(可能是我的误解)。但是,如果person定义为person(Name, Country, Father, Mother),则可能是:

eligible(Name, Country) :- person(Name, Country, _, _).
eligible(Name, Country) :- person(Name, _, Father, _),
                           person(Father, Country, _, _).
eligible(Name, Country) :- person(Name, _, _, Mother),
                           person(Mother, Country, _, _).

然后你的checkteam仍然会给你一个警告。在变量名的开头加上下划线以消除它:

checkteam([], _Country).