将术语的值转换为原子

时间:2013-07-10 11:51:06

标签: prolog

如果我的任何术语都已关闭,我会提前通知,自从我触摸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].

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

1 个答案:

答案 0 :(得分: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.

另外,我会更改这些事实的 style ,暂时,谓词命名应反映参数的位置:

animals_group([lion, elephant, dog], mammal).