我是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是否是列表的最后一个元素,或者我可能对此逻辑有误。
答案 0 :(得分:0)
areSameType/1
谓词在这里有两个问题:
[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).