检查元素是否在prolog列表中重复

时间:2017-05-14 19:47:16

标签: prolog

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的列表中重复?

2 个答案:

答案 0 :(得分:2)

使用Prologue of Prolog

  如果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]失败后达到,这意味着列表为空。我希望这很清楚,如果不是,请务必要求澄清。