结果与给定的事实不相比较



使用prolog生成一个代码,以获得一些比较的输出,但有些输出无法正常工作。这些似乎与事实不符。这里是代码

fact(Fact) :- Fact,!.
fact(Fact):-Fact = ..[Rel, Arg1, Arg2],isa(Arg1, SuperArg).
SuperFact =..[Rel,SuperArg,Arg2].
covers(animal,skin).
isa(fish,animal).
isa(bird,animal).
isa(mammal,animal).
isa(shark,fish).
isa(salmon,fish).
isa(parrot,bird).
isa(penguin,bird).
speacial_organ(fish,gills).
travel(fish,swim).
birth(bird,lay_eggs).
special_organ(bird,wings).
travel(bird,fly).
birth(fish,lay_eggs).
birth(mammal,not_lay_eggs).
birth(shark,not_lay_eggs).
nature(shark,dangerous).
food(salmon,delicacy).
colour(parrot,green).
travel(penguin,walk).

这是我想从这个程序中找到答案的问题

•鹦鹉会飞吗
•鹦鹉是什么颜色的
•鹦鹉有皮吗
•鲨鱼有危险吗?

第一步:定义isa/2的自反传递闭包(以下命名为is_a/2)。

isa(鱼、动物)。isa(鸟、动物)。isa(哺乳动物、动物)。isa(鲨鱼、鱼)。isa(三文鱼、鱼)。isa(鹦鹉、鸟)。isa(企鹅、鸟)。is_a(X,Y):-闭包0(isa,X,Y)。

第二步:指定剩余的事实(按谓词指示符分组)。

覆盖物(动物、皮肤)。special_organ(鱼、鳃)。special_organ(鸟,翅膀)。旅行(钓鱼、游泳)。旅行(鸟、飞)。旅行(企鹅、散步)。出生(鸟,lay_eggs)。出生(鱼,lay_eggs)。出生(哺乳动物,非出生)。出生(shark,not_lay_eggs)。大自然(鲨鱼,危险)。食物(三文鱼、美味)。颜色(鹦鹉、绿色)。

第三步:让我们问一些问题!

  • 鹦鹉会飞吗?

    ?-is_a(鹦鹉,X),旅行(X,飞行)。X=鸟;false。
  • 鹦鹉是什么颜色的?

    ?-is_a(鹦鹉,X),颜色(X,颜色)。颜色=绿色,X=鹦鹉;false。
  • 鹦鹉有皮吗?

    ?-is_a(鹦鹉,X),遮盖物(X,皮肤)。X=动物;false。
  • 鲨鱼危险吗?

    ?-is_a(鲨鱼,X),自然(X,危险)。X=鲨鱼;false。

最新更新