Пролог: добавить список для установки - PullRequest
1 голос
/ 05 сентября 2011

Приведенный ниже предикат добавляет элемент X в список S. Он отлично работает.

addToSet(X, S, S) :-
    atomic(X),
    member(X, S),
    !.
addToSet(X, S, [X|S]) :-
    atomic(X).

Я пытаюсь расширить его до предиката, который добавляет список [H | T] для установки S. Это прекрасно работает, если [H | T] имеет длину только 2 элемента ... т.е. если T также атомарный. *

addToSet([], S, S).
addToSet([H,T], S, S2) :-
    addToSet(H, S, S1),
    addToSet(T, S1, S2).

Например, addToSet ([5,6], [1,2,3,4], X). работает как я хочу. Однако addToSet ([5,6,7], [1,2,3,4], X). не работает вообще. Я в замешательстве ... очевидно, что-то не так с последними 2-3 строками моего кода, но я не могу понять это. Любые советы?

Спасибо!

1 Ответ

3 голосов
/ 05 сентября 2011

addToSet([H,T], S, S2) должно быть addToSet([H|T], S, S2).На самом деле вы соответствуете списку, содержащему ровно H и T, а не списку с заголовком H и хвостом T.Выглядит как опечатка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...