我期望做的是從列表中生成一個子列表,其中每個成員都滿足謂詞。因此,在一個名爲heightMatchList(Person1,HeightMatchList)的函子中,我希望通過調用genderMatchList並將GenderMatchList的成員添加到HeightMatchList來查看GenderMatchList的每個成員,如果這些成員滿足謂詞heightMatch(Person1,Person2),其中Person2是GenderMatchList的成員正在接受審查。序言:生成一個滿足謂詞的成員的子列表
該程序應該基於幾條信息來匹配人。我想使用這個子列表方法而不是使用bagof或findall的原因是,我只想搜索符合滿足性別要求的人羣中的高度要求的候選人。我試着在網上搜索生成的子列表,其中成員滿足謂詞,但他們通常回來bagof或findall。這是不合適的,因爲搜索空間不僅限於列表。
任何幫助將不勝感激。
代碼:
different(Person1,Person1):-
!,
fail.
different(_,_).
gender(Person,Gender):-
person(Person,Gender,_,_,_,_,_,_).
genderPref(Person,GenderPref):-
person(Person,_,GenderPref,_,_,_,_,_).
height(Person,Height):-
person(Person,_,_,Height,_,_,_,_).
heightPref(Person,Height):-
person(Person,_,_,_,Height,_,_,_).
weight(Person,Weight):-
person(Person,_,_,_,_,Weight,_,_).
weightPref(Person,WeightPref):-
person(Person,_,_,_,_,_,WeightPref,_).
petPref(Person,PetPref):-
person(Person,_,_,_,_,_,_,PetPref).
genderMatch(Person1,Person2):-
gender(Person1,Gender1),
genderPref(Person2,Gender1),
gender(Person2,Gender2),
genderPref(Person1,Gender2),
different(Person1,Person2).
heightMatch(Person1,Person2):-
height(Person1,Height1),
heightPref(Person2,Height1),
height(Person2,Height2),
heightPref(Person1,Height2),
different(Person1,Person2).
weightMatch(Person1,Person2):-
weight(Person1,Weight1),
weightPref(Person2,Weight1),
weight(Person2,Weight2),
weightPref(Person1,Weight2),
different(Person1,Person2).
petMatch(Person1,Person2):-
petPref(Person1,Pet),
petPref(Person2,Pet),
different(Person1,Person2).
match(Person1,Person2):-
genderMatch(Person1,Person2),
heightMatch(Person1,Person2),
weightMatch(Person1,Person2),
petMatch(Person1,Person2).
genderMatchList(Person,GenderMatchList):-
findall(X,genderMatch(Person,X),GenderMatchList).
編輯:
如果需要一些測試數據:
person(alice,female,male,small,medium,average,average,dog).
person(barry,male,female,medium,small,average,average,dog).
person(clara,female,female,tall,tall,average,average,cat).
person(danny,male,female,small,medium,average,average,cat).
person(elise,female,male,medium,small,average,average,dog).
person(fred,male,female,tall,small,average,average,dog).
person(grace,female,female,small,medium,average,average,dog).
person(harry,male,female,medium,tall,average,average,cat).
person(isabella,female,male,tall,tall,average,average,cat).
person(jack,male,female,small,medium,average,average,dog).
person(katie,female,female,medium,tall,average,average,dog).
person(larry,male,female,tall,tall,average,average,cat).
person(mel,female,male,small,medium,average,average,cat).
person(nathan,male,female,medium,small,average,average,dog).
person(olivia,female,female,tall,small,average,average,dog).
person(peter,male,female,small,medium,average,average,cat).
person(quinn,female,female,medium,tall,average,average,cat).
person(robert,male,female,tall,tall,average,average,dog).
person(sophie,female,male,small,medium,average,average,dog).
person(tom,male,female,medium,small,average,average,cat).
person(ursula,female,female,tall,small,average,average,cat).
person(vincent,male,female,small,medium,average,average,dog).
person(wendy,female,male,medium,tall,average,average,dog).
person(xavier,male,female,tall,tall,average,average,cat).
person(yvonne,female,female,small,medium,average,average,cat).
person(zed,male,female,medium,small,average,average,cat).
使用'不同(X,Y): - DIF(X,Y).'代替。 – false