#list #prolog
#Список #prolog
Вопрос:
Предположим, у нас есть алфавит {x,y}, и я хочу создать функцию, которая возвращает true или false, независимо от того, содержит ли входной список 2 символа x
друг за другом.
Например two([x,x,y]).
, возвращает true
, в то время two([x,y,x]).
как возвращает false
.
Это моя функция, которая у меня есть до сих пор:
two([Xs]) :- two(Xs, 0).
two([y|Xs], S) :- two(Xs, S).
two([x|Xs], S) :- oneX(Xs, S).
two([], S) :- S=1.
oneX([x|Xs], S) :- S1 is 1, two(Xs, M1).
oneX([y|Xs], S) :- two(Xs, S).
Я использую параметр S, чтобы определить, было ли уже 2 x
раза (если да, то параметр равен 1, 0 еще). Однако эта функция работает не так, как предполагалось, и всегда возвращается false
. Вы видите, что я делаю не так?
Комментарии:
1. Только
x
илиtwo([y, y])
достаточно?
Ответ №1:
Вы можете использовать унификацию здесь и, таким образом, проверить, можете ли вы унифицировать первые два элемента списка с X
помощью, если нет, вы повторяете список:
two([x, x|_]).
two([_|T]) :-
two(T).
Таким образом, первое предложение проверяет, являются ли первые два элемента списка двумя последовательными x
s. Второе предложение повторяется в конце списка для поиска другого соответствия, перемещаясь на один шаг вправо от списка.