Prolog — список содержит 2 элемента X

#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. Второе предложение повторяется в конце списка для поиска другого соответствия, перемещаясь на один шаг вправо от списка.