Пролог - Как определить, все ли элементы в списке строк равны? - PullRequest
0 голосов
/ 22 февраля 2019

Я работаю над этим прологическим назначением, где я должен проанализировать введенный пользователем список строковых символов (в частности, «u») и определить, все ли элементы равны строке «u».Если они есть, то он возвращает количество элементов, если нет, он возвращает ложь.Например:

uA(-Length,+String,+Leftover) //Prototype

?- uA(L,["u","u","u"],[]).
L = 3 .

?- uA(L,["u","u","d"],[]).
false.

Я достаточно хорошо понимаю, как работает пролог, но я не совсем понимаю, как работают списки.Любая помощь будет принята с благодарностью.Спасибо!

Редактировать: я добился некоторого прогресса с функцией сортировки (спасибо!), Но столкнулся с отдельной проблемой.

uA(Length, String) :-
   sort(String, [_]),
   member("u", String),
   length(String, Length).

Это в основном то, что мне нужнооднако, когда я запускаю его:

?- uA(L, ["u", "u", "u"]).
L = 3 ;
L = 3 ;
L = 3. 

Есть ли способ сделать так, чтобы он печатал L = 3 только один раз?Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

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

Просто используйте предикат библиотеки maplist/2 вместе со встроенным предикатом (=)/2:

?- maplist(=(X), Xs).
   Xs = []
;  Xs = [X]
;  Xs = [X, X]
;  Xs = [X, X, X]
;  Xs = [X, X, X, X]
…                             % ... and so on ...
0 голосов
/ 22 февраля 2019

Прежде всего, будьте осторожны с двойными кавычками в прологе.Их интерпретация зависит от значения стандартного флага double_quotes.Наиболее переносимое значение этого флага - codes, что, например, "123" интерпретируется как [49,50,51].Другие возможные значения этого флага: atom и chars.Некоторые системы Prolog, например SWI-Prolog, также поддерживают значение string.

Но вернемся к вашему вопросу.Быстрый способ проверить, что все элементы в базовом списке равны, - это использовать стандартный предикат sort/2 (который устраняет дублированные элементы).Например:

| ?- sort(["u","u","u"], [_]).

yes
| ?- sort(["u","u","d"], [_]).

no

Поскольку [_] объединяется с любым одноэлементным списком, вызов завершается успешно, только если сортировка приводит к списку с одним элементом, что происходит только для непустого основного списка, есливсе его элементы равны.Обратите внимание, что это решение не зависит от значения флага double_quotes.Учтите также, что вам нужно разбираться с пустым списком отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...