[英]Checking a relation of a prolog list element
可以說我有關系
Happy(james)
Happy(harry)
unhappy(Tom)
unhappy(Ben)
unhappy(Dick)
然后列出一個人
[Ben, James, Harry, Tom, Dick]
我如何迭代列表並檢查每個列表元素的布爾值是否滿意?
好吧,首先,在Prolog中,如果一個單詞以大寫字母開頭,則意味着它是一個變量。 所以你應該小心。
這是我更正后的數據庫:
happy(james).
happy(harry).
unhappy(tom).
unhappy(ben).
unhappy(dick).
我添加了一個遞歸規則,幫助我看到誰是快樂的,誰不是來自給定的列表:
emotion([]).
emotion([H|T]):- happy(H),emotion(T),
write(H),write(' is happy.'),
nl;
unhappy(H),emotion(T),
write(H),write(' is unhappy.'),
nl.
結果如下:
4 ?- emotion([ben, james, harry, tom, dick]).
dick is unhappy.
tom is unhappy.
harry is happy.
james is happy.
ben is unhappy.
true.
這是處理此任務的另一種方法。 這個答案並沒有與IO大驚小怪,這在這里是不必要的,並且它詳細介紹了所采用的策略:
我正在處理以下事實:
happy(james).
happy(harry).
unhappy(tom).
unhappy(ben).
unhappy(dick).
people([ben, james, harry, tom, dick]).
你可以通過一個簡單的謂詞來建立一個名稱和happy/1
和unhappy/1
謂詞之間的關系來實現你想要的結果:
person_happiness(Person, happy(Person)) :- happy(Person).
person_happiness(Person, unhappy(Person)) :- unhappy(Person).
這個person_happiness/2
利用了Prolog的同性戀本性。 在規則主體中出現的happy/1
實例是對謂詞的調用,並且只有在Person
可以統一調用事實happy/1
時才是真實的。 在person_happiness/2
的第二個參數中出現的happy/1
實例用作數據結構,並且基本上用於將Person
標記為happy。 第二個論點可以用happy-Person
, happy/Person
, happy=Person
, emotion(Person, happy)
以及許多其他事物來代替。
僅憑這個謂詞,我們就可以通過回溯自由變量來生成所有快樂和不快樂的人的報告:
?- person_happiness(Person, Happiness).
Person = james,
Happiness = happy(james) ;
Person = harry,
Happiness = happy(harry) ;
Person = tom,
Happiness = unhappy(tom) ;
Person = ben,
Happiness = unhappy(ben) ;
Person = dick,
Happiness = unhappy(dick).
我們也可以找到特定人的幸福:
?- person_happiness(dick, Happiness).
Happiness = unhappy(dick).
我們可以找到所有共同品質的人:
?- person_happiness(Person, happy(Person)).
Person = james ;
Person = harry.
上面的查詢只是通過查詢happy/1
和unhappy/2
的事實來工作,但是你想根據列表中的名字檢查這些事實。 我們可以將member/2
與person_happiness/2
結合使用,以通過回溯實現您想要的一切:
?- people(Ps), member(P, Ps), person_happiness(P, PH).
Ps = [ben, james, harry, tom, dick],
P = ben,
PH = unhappy(ben) ;
Ps = [ben, james, harry, tom, dick],
P = james,
PH = happy(james) ;
Ps = [ben, james, harry, tom, dick],
P = harry,
PH = happy(harry) ;
Ps = [ben, james, harry, tom, dick],
P = tom,
PH = unhappy(tom) ;
Ps = [ben, james, harry, tom, dick],
P = dick,
PH = unhappy(dick).
要獲得所有這些結果在一氣呵成的,我們可以用maplist/3
申請person_happiness/2
到的每個成員People
的people(People)
:
?- people(People), maplist(person_happiness, People, PeopleHappiness).
People = [ben, james, harry, tom, dick],
PeopleHappiness = [unhappy(ben), happy(james), happy(harry), unhappy(tom), unhappy(dick)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.