Получение первых элементов
Шаблон [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].