multi_available(X):-
member(X,
[grilled_chicken,
jambo_beef,
grilled_cheese_sandwich,roast_beef,potato_salad,chicken_rice,
jambo_beef,
service_dish,service_dish,
beef_stew,potato_corn,grilled_chicken,roast_beef,mushroom_rice,
service_dish,
jambo_beef]).
member(X,[X|_]).
member(X,[_|T]):-member(X,T).
如何检查元素是否在Prolog的列表中重复?
答案 0 :(得分:2)
如果X是列表L的元素,则成员(X,L)为真 如果X是
的元素,则选择(X,Xs,Ys)为真 列表Xs和Ys是列表Xs,其中删除了一次X.
我得到以下简单的解决方案:
:- use_module(library(basic/lists)).
multi_available(L, X) :- select(X, L, R), member(X, R).
它可能不是最有效的。但它的确有效:
Jekejeke Prolog 2, Runtime Library 1.2.5
(c) 1985-2017, XLOG Technologies GmbH, Switzerland
?- multi_available([a,b,c,b,a,d],X).
X = a ;
X = b ;
X = b ;
X = a ;
No
答案 1 :(得分:0)
我不确定你是否只想知道一个元素是否出现多次,或者你是否需要它出现多少次,所以这两者都是!
查看列表是否包含元素,每次出现时是否计数+1
occurrences(Element,[Head|Tail], Count, OutputCount) :-
Element = Head,
NewCount is Count + 1,
occurrences(Element, Tail, NewCount, OutputCount).
元素与List的第一个元素不匹配?不要添加1,转到下一个元素。
occurrences(Element, [Head|Tail], Count, OutputCount) :-
Element \= Head,
occurrences(Element, Tail, Count, OutputCount).
如果List为空,则返回最终计数
occurrences(Element,[],Count,Count).
由于Count不能为负数,只需将其作为零传递,只返回结果。
occurrences(Element, List, Count) :- occurrences(Element, List, 0, Count).
检查结果是否高于1
moreThanOnce(Element, List) :-
occurrences(Element, List, Count),
Count > 1.
元素在List中出现多次吗?
?- moreThanOnce(1, [1,2,3,1,1,1]).
它发生了多少次?
?- occurrences(1, [1,2,3,1,1,1], Count).
请注意,如果列表为空,[Head | Tail]将自动失败,List = []会自动成功。这意味着OutputCount在整个程序中保持为空,直到满足结束条件,这仅在[Head | Tail]失败后达到,这意味着列表为空。我希望这很清楚,如果不是,请务必要求澄清。