让我说我有关系
Happy(james)
Happy(harry)
unhappy(Tom)
unhappy(Ben)
unhappy(Dick)
然后是人员列表
[Ben, James, Harry, Tom, Dick]
如何迭代列表并检查每个列表元素的布尔值是否满意?
答案 0 :(得分:2)
嗯,首先,在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.
答案 1 :(得分:1)
这是处理此任务的另一种方法。这个答案并没有与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
时统一,则确实如此。在happy/1
的第二个参数中出现的person_happiness/2
实例用作数据结构,并且基本上用于将Person
标记为快乐。第二个参数可以替换为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)]