检查prolog列表元素的关系

时间:2014-06-04 14:54:54

标签: list prolog

让我说我有关系

Happy(james)
Happy(harry)
unhappy(Tom)
unhappy(Ben)
unhappy(Dick)

然后是人员列表

[Ben, James, Harry, Tom, Dick]

如何迭代列表并检查每个列表元素的布尔值是否满意?

2 个答案:

答案 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/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时统一,则确实如此。在happy/1的第二个参数中出现的person_happiness/2实例用作数据结构,并且基本上用于将Person标记为快乐。第二个参数可以替换为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/3person_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)]