смежный с участием первого и последнего элемента, Пролог - PullRequest
2 голосов
/ 13 июля 2020

HI Я хотел бы знать, как метод, который определяет, являются ли два члена списка в Prolog смежными, поскольку уловка состоит в том, что первый и последний элементы проверяются, если они смежны, что-то вроде

  (b,c,[b,a,d,c])

даст да, они смежные. У меня уже есть этот код

adjacent(X, Y, [X,Y|_]).
adjacent(X, Y, [_|Tail]) :-
    adjacent(X, Y, Tail).

, но я не знаю, как включить заголовок списка и последние элементы, которые сравниваются на предмет смежности. Если вы действительно хороши, возможно, вы также можете сказать мне, как можно сделать что-то вроде этого

(c,b,[a,b,c,d]), чтобы быть правдой Я имею в виду, что элементы смежны, независимо от того, какой именно первый.

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Отношения в списках часто можно описать с помощью грамматики с определенными предложениями .

Первая попытка может быть:

adjacent(A, B, L) :-
   phrase(adjacent(A, B), L).  % interface to DCG

adjacent(A,B) -->
   ..., ( [A,B] | [B,A] ), ... .

... --> [] | [_], ... .

Тем не менее, здесь не учитываются случаи как adjacent(a,d,[a,b,c,d]). Одна из возможностей - добавить другое правило или просто расширить список, который будет учитываться.

adjacent(A, B, L) :-
   L = [E,_|_],
   append(L, [E], M),
   phrase(adjacent(A, B), L).
1 голос
/ 13 июля 2020

Вы можете использовать last/2 предикат [swi-doc] , чтобы получить последний элемент списка. Но вы не можете использовать это в рекурсивном вызове, поскольку в противном случае каждый элемент в паре списка также будет с последним элементом. предикат adjacent/3 для вызова рекурсивного предиката, который вы написали сами, или предиката, в котором мы сопоставляем последний элемент:

adjacent(X, Y, L) :-
    adj(X, Y, L).
adjacent(X, Y, [Y|T]) :-
    <b>last(T, X)</b>.

adj(X, Y, [X,Y|_]).
adj(X, Y, [_|T]) :-
    adj(X, Y, T).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...