2013-07-10 37 views
2

如果我的术语是关闭的,我已经提前申请了一个术语,从我接触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)时,文本Not Found!被显示并失败,向我暗示,原子哺乳动物和狮子正在转化为术语,因此不会与他们各自的规则相关联。

当我直接调用两个规则,我得到预期的结果

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

有没有一种方法,一个原子可以通过一个学期获得通过,在这种情况下,则原子重新提取或很我解决这个错误的方式?

回答

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). 
+0

当然,这是有道理的。我所做的事情看起来很复杂,并且知道我已经把事情搞糟了,因为它曾经有一段时间,因为我甚至触及了一种没有程序的语言。感谢您的建议和解释! –

+1

那些缩写“哺乳动物: - 真实”表明你正在尝试一些*更复杂的事情。最终,随时跟进这个问题...... – CapelliC

+0

当然。我不确定它是否有必要,但我实际上是用它来作为原子的*声明。然而,正如我在阅读我的一些旧的uni笔记,似乎我实际上并不需要预先声明事情。 –