Сравнить и удалить элементы из списка - PullRequest
0 голосов
/ 11 мая 2018

Итак, я хочу создать программу, которая, учитывая список и элемент, возвращает только список, пока не появится указанный элемент, например:

propaga( [(1,1),(1,2),(1,3),(1,4)],(1,3),L).
L = [(1,1),(1,2),(1,3)].

В настоящее время у меня есть это:

adiciona((X,Y),[],[(X,Y)]).
adiciona((X,Y), [(W,Z)|Tail],[(W,Z)|Tail1]):-
    adiciona((X,Y),Tail,Tail1).

 propaga_aux([X|_], X, [X]).

 propaga_aux([(X,Y)|_], (Z,W), P):-
   (X,Y) = (Z,W), !,
   adiciona((X,Y),[],P).

 propaga_aux([(X,Y)|T], (Z,W), P):-
  (X,Y) \= (Z,W), !,
  adiciona((X,Y),[],P),
  propaga_aux(T, (Z,W), P).

Adiciona добавляет элемент в конец списка. Он продолжает возвращать false, я думаю, проблема в том, как я использую предикат adiciona, но я не могу понять, что я делаю неправильно, я перепробовал много вариантов, и я не могу понять это правильно, может кто-то помочь мне

1 Ответ

0 голосов
/ 11 мая 2018

Ваш предикат adiciona работает правильно.

Однако учтите, что вам не обязательно повторять термин (A,B) везде. Если вы поместите одну переменную вместо нее, она будет работать так же, и она будет более общей.

Проблема в другом предикате: я бы сделал так:

  • когда вы еще не нашли соответствующий элемент, элементы рекурсивно копируются в список вывода;
  • Когда соответствующий элемент найден, список вывода состоит только из этого элемента, и рекурсия остановится.

В этот момент вы понимаете, что предикат adiciona не нужен для решения этой проблемы.

Код пролога:

propaga([X|Xs], Z, [X|Ys]) :- X \= Z, propaga(Xs, Z, Ys).
propaga([X|_], X, [X]).

Тест:

?- propaga( [(1,1),(1,2),(1,3),(1,4)],(1,3),L).
L = [(1, 1),  (1, 2),  (1, 3)] ;
false.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...