簡體   English   中英

檢查prolog列表元素的關系

[英]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/1unhappy/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-Personhappy/Personhappy=Personemotion(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/1unhappy/2的事實來工作,但是你想根據列表中的名字檢查這些事實。 我們可以將member/2person_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到的每個成員Peoplepeople(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM