【问题标题】:Prolog statements/commands with animals (logic help)带有动物的 Prolog 语句/命令(逻辑帮助)
【发布时间】:2012-10-28 22:19:42
【问题描述】:

我想知道如何让这样的事情发挥作用。 这似乎是一个简单的概念,但我对 Prolog 很陌生,我似乎无法弄清楚如何正确地做到这一点。

例如,这里有两张表。每只动物,无论属于哪个类别,都有两个事实。

哺乳动物:

老虎-条纹,强大

河马——大而危险的

大象——大而温柔

昆虫:

苍蝇——黑色,有翅膀

毛毛虫 - 绿色,缓慢

蜗牛——黏糊糊的,慢的

如何在 Prolog 代码中编写所有这些语句,以便将苍蝇及其特征归类为昆虫,将河马及其特征归类为哺乳动物?

那么,如果我插入这样的规则呢?

guess(mammal, large) 

查阅代码后,我会写出这个命令:

possibleanimal(mammal, X) 

该命令的结论是:

X = hippo 
X = elephant 

因为河马和大象都有大的特征。

另一个例子:

guess(insect, slow) 
guess(insect, green)

咨询后询问的命令:

possibleanimal(insect, Y) 
Y= caterpillar 

我们可以省略蜗牛,因为即使它很慢,它也不是绿色的。

请尽你所能帮助我,谢谢!

【问题讨论】:

    标签: prolog logic


    【解决方案1】:

    第一个例子看起来像传递性, 所以试试这个:

    % animal(Animal, Property)
    animal(tiger, striped).
    animal(tiger, powerful).
    animal(hippo, large).
    animal(hippo, dangerous).
    animal(elephant, large).
    animal(elephant, gentle).
    
    % guess(Category, Property)
    guess(mammal, large).
    
    % possibleanimal(Category, Animal)
    possibleanimal(C, A) :-
           guess(C, P),
       animal(A, P).
    
    ?- possibleanimal(mammal, X).
    X = hippo ;
    X = elephant
    

    现在棘手的部分是第二个例子,因为 我们有多个猜测/2。

    我猜你希望他们同时持有。 所以你需要一种forall。

    Forall 可以在 Prolog 中定义如下:

    % forall(Goal,Goal)
    forall(A, B) :- \+ (A, \+ B).
    

    例如: http://www.swi-prolog.org/pldoc/man?predicate=forall%2F2

    所以你可以试试这个:

    % possible(Animal)
        possible(fly).
        possible(caterpillar).
        possible(snail).
    
        % animal(Animal, Property)
    animal(fly, black).
    animal(fly, winged).
    animal(caterpillar, green).
    animal(caterpillar, slow).
    animal(snail, slimy).
    animal(snail, slow).
    
    
    % guess(Category, Property)
    guess(insect, green).
    guess(insect, slow).
    
    % possibleanimal(Category, Animal)
        possibleanimal(C, A) :-
            possible(A),
            forall(guess(C,P), animal(A,P)).
    
    ?- possibleanimal(insect,X).
    X = caterpillar ;
    No
    

    希望这会有所帮助。

    再见

    【讨论】:

      猜你喜欢
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多