Пролог проблема! «одиночки»! - PullRequest
2 голосов
/ 01 июня 2011

У меня есть домашняя работа по прологу, которая должна работать так:

  singles([1,2,3,2,2,4,1], [3,4]).
  true

Теперь я понял, что должен проверить, является ли один элемент одним в списке, а затем собрать все элементы вместе ... тогда я записал:

singles(L,SL):-findall(X,isSingle(X,L),SL).
isSingle(X,L):-member(X,L),append(Y,[X|Z],L),not(member(X,L1)),append(Y,Z,L1).

в функции isSingle X должен быть в списке L, но не в новом списке L1 без X, как 1 в [2,1,3], но не в [2,3], но, к сожалению, все не работает так, как я думал: (

Я думаю, что проблема в isSingle части, кто-нибудь может мне помочь?

Ответы [ 2 ]

3 голосов
/ 01 июня 2011

Переключите порядок not(member(X,L1)) и append(Y,Z,L1), и ваш код работает. Я не эксперт по Прологу, поэтому я не совсем уверен в этом, но, пройдя по трассировке, мне кажется, что это связано с тонкостями использования not. Вы заставляете оценку member на L1 до того, как она будет унифицирована в append(Y,Z,L1) бит.

1 голос
/ 01 июня 2011

singles(List,SelectList) :-
        singles(List,List,SelectList).

singles([],List,[]).
singles([A|R1],List,[A|R2]) :-
        unique(A,List),
        singles(R1,List,R2).
singles([A|R1],List,R2) :-
        \+(unique(A,List)),
        singles(R1,List,R2).

unique(A,List) :-
        append(L0,[A|R],List),
        \+(append(_,[A|_],L0)),
        \+(append(_,[A|_],R)).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...