1

我正在为 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).

最后两行特别是我遇到的问题,我正在尝试使用合格()函数测试列表的每个成员,然后让 tail 的第一个元素成为头部并重复。

我想不出一种方法来测试每个成员,然后如果任何成员不符合条件则显示失败,或者如果所有成员都属于该国家/地区则显示失败。

提前致谢。

编辑:正在鬼混并稍微更改了代码,至于结果

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

即使 bruce 或 dan 都不是来自 Mayday 或任何父母或祖父母。

4

1 回答 1

1

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

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).
于 2013-05-04T20:21:26.043 回答