Предикат для трех экземпляров в списке? - PullRequest
2 голосов
/ 10 октября 2019

Я пишу предикат для печати true, если список содержит 3 копии элемента, а также для печати элемента. Также предикат должен выводить альтернативные решения, если они существуют.

Предикат, который я написал -

hasTriplicate(List):-hasTriplicateAcc(List,Element,0).

%hasTriplicateAcc is wrapped by predicate hasTriplicate since I wanted the arity of hasTriplicate to be 1.

hasTriplicateAcc(_,Element,3):-write(Element).
hasTriplicateAcc([H|T],H,Ct):-hasTriplicateAcc(T,H,Ct1),Ct1 is Ct+1.
hasTriplicateAcc([Z|T],H,Ct):-hasTriplicateAcc(T,H,Ct),Z=\=H.

Вывод

hasTriplicate([1,1,1]).
11
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR:   [11] 3 is _10188+1
ERROR:   [10] hasTriplicateAcc([1,1],1,_10218) at c:/users/user/desktop/code/hastriplicate.pl:3
ERROR:    [9] hasTriplicateAcc([1,1|...],1,0) at c:/users/user/desktop/code/hastriplicate.pl:3
ERROR:    [7] <user>
ERROR: 
ERROR: Note: some frames are missing due to last-call optimization.
ERROR: Re-run your program in debug mode (:- debug.) to get more detail.
Exception: (10) hasTriplicateAcc([1, 1], 1, _10332)

Я не понимаюошибка. Было бы хорошо, если бы кто-нибудь сказал мне, как исправить мой код для предиката.

1 Ответ

0 голосов
/ 02 ноября 2019

Я думаю, что это решение будет работать.

hascountminimal(_,_,0):-true,!.
hascountminimal([E|L],E,N):- ! , N1 is N - 1 , N >= 1 , hascountminimal(L,E,N1) .
hascountminimal([_|L],E,N):- hascountminimal(L,E,N).


intripple(L,E):-hascountminimal(L,E,3),write(E).
...