2

如果我的任何术语被关闭,我会提前道歉,自从我接触 Prolog 已经有几年了,我决定尝试去除我的 prolog 帽并再次探索它。

我将直接深入研究代码,然后通过问题描述偶然发现。此代码不是我的情况的确切主题。

mammal :- true.
reptile :- true.

animals_that_are(_,_) :- 
    write('Not found!'), 
    nl, 
    false.

animals_that_are(mammal, L) :- 
    L = [lion, elephant, dog].

animals_that_are(reptile, L) :- 
    L = [lizard, turtle].

does_animal_belong_to_group(Species, Group) :-
    animals_that_are(Group, Animals),
    member(Species, Animals).

所以基本的问题是,调用时does_animal_belong_to_group(lion, mammal),文本未找到!显示并失败,向我暗示,原子哺乳动物和狮子正在被转换为术语,因此与它们各自的规则无关。

当我直接调用这两个规则时,我确实得到了预期的结果

animals_that_are(reptile, L).
L = [lizard, turtle].

有没有一种方法可以让原子通过一个术语,然后在这种情况下重新提取原子,还是我以错误的方式解决这个问题?

4

1 回答 1

1

我认为你做的比必要的更复杂:

animals_that_are(mammal, [lion, elephant, dog]).
animals_that_are(reptile, [lizard, turtle]).

does_animal_belong_to_group(Animal, Group) :-
    animals_that_are(Group, Animals),
    member(Animal, Animals).

?- does_animal_belong_to_group(lion, mammal).
true ;
false.

另外,我会改变这些事实的风格,暂定,谓词命名应该反映参数的位置:

animals_group([lion, elephant, dog], mammal).
于 2013-07-10T13:05:52.207 回答