Первые элементы списка списка Пролог - PullRequest
0 голосов
/ 02 января 2019

Я изучаю Пролог, и я вижу этот код

foo([],[]).
foo([[A,_ ]|L], [A|P]) :-foo(L ,P).

Результат говорит о том, что этот код занимает N элемент списка, например, Ad, если мы даем этот запрос:

?foo([[car],[house],[man]],X)
X= [c,h,m]

При первом прочтении вижу, что что-то не так.Для меня этот код берет хвост списка списка и остальную часть первого элемента списка, поэтому для меня первое расширение будет (трассировка)

foo([[house],[man]], ar)
foo([[man]], ouse)
foo([], an)
false.

Я пытаюсь скомпилировать с swi-прологом и датьэтот след:

[trace]  ?- trace,foo([[car],[house],[man]],X).
Call: (9) foo([[car], [house], [man]], _1016) ? creep
Fail: (9) foo([[car], [house], [man]], _1016) ? creep
false.

В чем я не прав?

1 Ответ

0 голосов
/ 02 января 2019

Получение первых элементов

Шаблон [A, _] в вашем предложении неверен или, по крайней мере, недостаточно универсален . [A, _] объединяется со списком, который содержит ровно два элемента, но, таким образом, это не удастся для списков с более чем двумя элементами или с одним элементом, как вы узнали.

Вам нужно использовать шаблон [A|_]: на самом деле это список, в котором голова A, а нас не интересует остальное (хвост). как:

foo([],[]).
foo([<b>[A|_]</b>|L], [A|P]) :- foo(L, P).

При этом вы можете упростить это, реализовав предикат, который занимает заголовок списка:

head([H|_], H).

, а затем используйте maplist/3 [swi-doc] :

foo(A, B) :-
    <b>maplist</b>(head, A, B).
Таким образом,

maplist будет вызывать head как head(A<sub>i</sub>, B<sub>i</sub>), с A<sub>i</sub> и B<sub>i</sub> элементами A и B соответственно.

Получение подстроки с первым символом

но, исходя из примера вывода, это не то, что вам нужно: вы также хотите получить первый «символ» атома, мы можем сделать это, используя string_chars/2 [ SWI-документ]

head_first([A|_], C) :-
    string_chars(A, [C|_]).

, а затем снова определите foo/2 с помощью maplist/3 [swi-doc] :

foo(A, B) :-
    maplist(head_first, A, B).

тогда мы получим:

?- foo([[car],[house],[man]], X).
X = [c, h, m].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...