Пролог программы первый, без рекурсии? - PullRequest
0 голосов
/ 12 октября 2018

Как мне написать прологическую программу, подобную приведенной ниже, которая успешно работает, если список содержит одинаковые первый и последний элементы, но без рекурсии, используя только предикат добавления?

firstlast([H,H]).
firstlast([F,_|T]) :- firstlast([F|T]).

Примеры запросов:

?- firstlast([1,2,3,1]).
Yes

?- firstlast([1,2,3]).
No

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Вам нужно будет использовать какой-то предопределенный предикат Prolog, если вы не собираетесь использовать рекурсию.Простое решение может использовать reverse/2.

firstlast([H|T]) :- reverse([H|T], [H|_]).

Это создает хорошее общее решение:

| ?- first_last(L).

L = [_] ? ;

L = [A,A] ? ;

L = [A,_,A] ? ;

L = [A,_,_,A] ? ;

L = [A,_,_,_,A] ?
...

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

firstlast([X,Y|T]) :- reverse([X,Y|T], [X|_]).

Выход:

| ?- firstlast(L).

L = [A,A] ? ;

L = [A,_,A] ? ;

L = [A,_,_,A] ? ;

L = [A,_,_,_,A] ?
...
0 голосов
/ 12 октября 2018

Я думаю, что в вашем предикате отсутствует крайний регистр: список singleton : в списке с ровно одним элементом первый и последний элементы совпадают.

<b>firstlast([_]).</b>
firstlast([H,H]).
firstlast([F,_|T]) :- firstlast([F|T]).

Вы можете использовать append/3 для получения последнего элемента с:

last(L, Last) :-
    append(_, [Last], L).

Эта работа, поскольку добавление [Last] к определенному списку может привести только к списку с Last в качестве последнего элемента.Поскольку этот список равен L, а append/3 может работать в этом направлении, мы можем получить последний элемент.Например:

?- append(_, [Last], [1,4,2,5]).
Last = 5 ;
false.

Думаю, с помощью этой подсказки вы сможете решить проблему без рекурсии.

...