如果我的任何术语都已关闭,我会提前通知,自从我触摸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].
有没有一种方法可以通过一个术语传递原子,然后在这种情况下重新提取原子,或者我是以错误的方式解决这个问题?
答案 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).