Prolog 如何仅使用append检查列表中元素是否至少出现两次?-序言

Prolog 如何仅使用append检查列表中元素是否至少出现两次?-序言,prolog,Prolog,我得到了一个赋值,其中我必须定义一个名为二(X,L)的谓词,如果列表L包含元素X的至少两个匹配项,则这是真的,只使用append谓词。我的任何规则的右侧都可以只使用append,或使用谓词二(X,L)。例如,我想要的输出是这样的 two(x,[a,a,b,a,c,b,a]). X = a X = b two(c,[a,a,b,a,c,b,a]). FALSE 我一直在想一种方法来实现这一点,但根据我对append的了解,我们在two(X,L)中真正可以使用的唯一谓词是append(X,X,L

我得到了一个赋值,其中我必须定义一个名为二(X,L)的谓词,如果列表L包含元素X的至少两个匹配项,则这是真的,只使用append谓词。我的任何规则的右侧都可以只使用append,或使用谓词二(X,L)。例如,我想要的输出是这样的

two(x,[a,a,b,a,c,b,a]).
X = a
X = b

two(c,[a,a,b,a,c,b,a]).
FALSE
我一直在想一种方法来实现这一点,但根据我对append的了解,我们在
two(X,L)
中真正可以使用的唯一谓词是
append(X,X,L)
。Append不是一个真/假的东西,是吗,它只是尝试将X放入L中两次


我不需要有人帮我解决这个任务,我只需要一个垫脚石,因为我不知道如何只用append来完成这个任务。

根据@user27815的评论和之前的答案,另一个解决方案可能类似于下面的代码,其中,辅助谓词需要集成到
two
谓词中:

two(X,List):-append(_,[X|Rest],List),append(_,[X|_Rest2],Rest).
two(X, [Y|Ys]) :-
    two_helper(X, [Y|Ys]),
    \+ two_helper(X, Ys).

two(X, [_|Ys]) :-
    two(X, Ys).

two_helper(X,List) :- append(_,[X|Rest],List),append(_,[X|_Rest2],Rest).

这有时会给出多余的答案。你说多余是什么意思?如果希望确保两个不留下一个选择点,可以将切割操作符(!)添加到正文的末尾。
?-two(X[a,a,b,a,c,b,a])。X=a X=a X=a X=a X=a X=b X=a
在正文末尾的剪切将是不正确的,该问题要求仅使用append来定义。