检查列表的所有元素是否都是相同的数据类型(我猜是原子)。序言

时间:2019-06-06 15:54:16

标签: prolog

我是Prolog的初学者。我有一些自定义类型:鸟,动物和鱼。我想将列表传递给类似areSameType([owl, eagle, chicken])的函数。如果整个列表是鸟,动物或鱼,则得出结果。例如:

areSameType([owl,giraffe,shark]). > false
areSameType([owl,eagle,chicken]). > true
areSameType([cat,mouse,giraffe]). > true

我插入的数据是:

bird(owl).
bird(eagle).
bird(chicken).
animal(cat).
animal(mouse).
animal(giraffe).
fish(shark).
fish(magikarp).
fish(gyarados).

我尝试使用此功能:

isSameType(X,Y):- bird(X),bird(Y);animal(X),animal(Y);fish(X),fish(Y).
areSameType([H1,H2|T]):- isSameType(H1,H2), areSameType([H2,T]).

但是问题是我没有标准来检查H2是否是列表的最后一个元素,或者我可能对此逻辑有误。

1 个答案:

答案 0 :(得分:0)

areSameType/1谓词在这里有两个问题:

  1. 没有停止条件:如果列表为空或仅包含一个元素,则列表中的所有项目都具有相同的类型;和
  2. 您需要使用[H2|T]进行递归(注意 pipe |,而不是逗号,)。

所以我们可以通过以下方式解决此问题:

areSameType([]).
areSameType([_]).
areSameType([H1,H2|T]):-
    isSameType(H1,H2),
    areSameType([H2|T]).

但是,我们可以在此处使用maplist/2 [swi-doc],并且无需递归就可以编写此谓词(areSameType/1谓词本身也不能进行递归),例如:

areSameType([]).
areSameType([H1|T]) :-
    maplist(isSameType(H1), T).