Пролог - определить подсписки переменных - PullRequest
0 голосов
/ 01 мая 2020

У меня есть задание, в котором я должен выполнить sh следующее - учитывая список, такой как:

List = [_, _, $, _, _, _, _, $, _, $].

Я должен написать предикат pred/2 с помощью pred(List, Sub) так, что это true тогда и только тогда, когда Sub является подсписком размера> = 2 без смежных переменных, в которых ни один из членов не является $. Примеры:

List = [X, Y, $, P, Q, R, S, $, A, $], pred(List, [X, Y]) должно быть успешным.

List = [X, Y, $, P, Q, R, S, $, A, $], pred(List, [P, Q, R]) не должно быть успешным, поскольку S смежно с P, Q, R.

List = [X, Y, $, P, Q, R, S, $, A, $], pred(List, [P, Q, R, S]) должно быть успешным.

List = [X, Y, $, P, Q, R, S, $, A, $], pred(List, [A, $]) не может быть успешным, поскольку он включает $.

Я написал следующий код, который, согласно небольшому количеству тестирования, делает то, что я хочу:

pred(List, Sub) :- pred(List, Sub, []).
pred([], Sub, Sub) :- length(Sub, Len),
                             Len >= 2.
pred([H|T], Sub, Aux) :- H \== $, !,
                                  append(Aux, [H], New), 
                                  pred(T, Sub, New).
pred([$|_], Sub, Sub):- length(Sub, Len), Len >= 2.
pred([$|T], Sub, _) :- pred(T, Sub, []).

Тем не менее, я чувствую, что это решение занудное. Хотя я знаю, что StackOverflow, в общем, предназначен для вещей, которые люди не могут сделать , я действительно чувствую, что нашел довольно сложное решение простой проблемы и хотел бы узнать о лучший способ выполнить sh то, что я хочу.

Заранее спасибо!

1 Ответ

1 голос
/ 01 мая 2020

append / 2 - удобный предикат из библиотеки (списков). Это позволяет легче выполнять требования:

pred(L, S) :-
    append([X, S, Y], L),
    length(S, C), C >= 2,
    maplist(\==($), S),
    ( X = [] ; last(X, X_), X_ == $ ),
    ( Y = [] ; Y = [Y_|_], Y_ == $ ).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...