Список с атомарными элементами Swi-Prolog - PullRequest
0 голосов
/ 30 января 2019

Я застрял на этой проблеме.Я хочу проверить, являются ли все элементы в списке атомарными, но я не могу решить это.

Например:
[] является атомарным

список [1, 2, 3] являетсясозданный атомарными элементами

список [[1], 2, 3] не потому, что [1] является составным

Еще одним лучшим решением для моей проблемы будет сбой предиката, если в одном или нескольких составных элементахсписок.Кто-нибудь может мне помочь?

Вот что я пытался сделать.

check_atomic([], true).   
check_atomic([H | T], true) :-
   atomic(H),
   check_atomic([T, _ ]).

1 Ответ

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

Проблема в том, что вы здесь определяете check_atomic/2.Однако во втором случае вы вызываете предикат check_atomic/1 (с одним параметром).Кроме того, вместо прохождения хвоста списка вы создаете список с двумя элементами, первый из которых является хвостом.

Предикат успешно выполняется или не выполняется.Так что здесь уже есть true или false.Вам не нужно добавлять дополнительный параметр для этого.Если предикат не работает, он напечатает false (или no) на стандартном выходном канале.

Таким образом, мы можем исправить это, переписав его в:

check_atomic([]).
check_atomic([H|T]) :-
    atomic(H),
    check_atomic(T).

Используя maplist/2

Здесь можно использовать maplist/2 [swi-doc] , а в качестве предиката использовать atomic/1 [swi-doc] :

check_atomic(L) :-
    <b>maplist</b>(<b>atomic</b>, L).
...