Пролог, как добавить элемент в список, если есть в списке - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь создать элемент списка ( member / 2 ) с моим собственным предикатом.

, начиная этот пример

?-app([a,r,t],[t,s,m,n,a],L3). 

L3=[a,t]

Я пытался сделать подобноеупражнения, так что я сделал это с прологом:

app([],_,[]).
app([H|T],[H1,T1],[H|L1]):- H is H1,  L1 is H,! ,app(T,T1,L1).
app([_H|T],L,L2):-  app(T,L,L2).

и все работает регулярно, но значение в списке будет перезаписано во время выполнения, на самом деле, трассировка:

trace, app([3,2],[3,5],X).
   Call: (9) app([3, 2], [3, 5], _7426) ? creep
   Call: (10) 3 is 3 ? creep
   Exit: (10) 3 is 3 ? creep
   Call: (10) _7736 is 3 ? creep
   Exit: (10) 3 is 3 ? creep
   Call: (10) app([2], 5, 3) ? creep
   Call: (11) app([], 5, 3) ? creep
   Fail: (11) app([], 5, 3) ? creep
   Fail: (10) app([2], 5, 3) ? creep
   Fail: (9) app([3, 2], [3, 5], _7426) ? creep
false.

Я попытался внести изменения в базовый вариант следующим образом:

app([],_,_N).

, но вывод совершенно неправильный:

trace, app([3,2],[3,5],X).
   Call: (9) app([3, 2], [3, 5], _7426) ? creep
   Call: (10) 3 is 3 ? creep
   Exit: (10) 3 is 3 ? creep
   Call: (10) _7736 is 3 ? creep
   Exit: (10) 3 is 3 ? creep
   Call: (10) app([2], 5, 3) ? creep
   Call: (11) app([], 5, 3) ? creep
   Exit: (11) app([], 5, 3) ? creep
   Exit: (10) app([2], 5, 3) ? creep
   Exit: (9) app([3, 2], [3, 5], [3|3]) ? creep
X = [3|3].

где я ошибаюсь?

1 Ответ

1 голос
/ 18 июля 2019

Я думаю, вы пытаетесь создать предикат sublist/2:

%! sublist(Sub, List)
% is true if Sub is a list that occurs in
% some position in List
sublist(Sub, List) :-
    % first partition off some tail of the list
    append(_Prefix, Tail, List),
    % then get some prefix of the tail, this is a sublist
    append(Sub, _TailTail, Tail).

Есть еще способы сделать это, но я думаю, append/3 просто Понимаю. Это проблема, отличная от member/2, который находит элементы в списке, здесь наша проблема состоит в том, чтобы разделить список на куски, поэтому реализация отличается от реализации, показанной в member/2. В Прологе вы часто найдете первый шаг к решению проблемы - правильно определить проблему. Удачи в изучении Пролога.

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