列出原子元素 Swi-Prolog

List with atomic elements Swi-Prolog

我被这个问题困住了。我想检查列表中的所有元素是否都是原子的,但我无法解决。

例如:
[] 是原子的

列表[1, 2, 3]由原子元素组成

list [[1], 2, 3] 不是因为 [1] 是化合物

我的问题的另一个更好的解决方案是,如果列表中有一个或多个复合元素,则使谓词失败。 有人可以帮助我吗?

这就是我尝试做的。

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

问题是你在这里定义了一个check_atomic/2。然而,在第二种情况下,您调用谓词 check_atomic/1(带有一个参数)。此外,不是传递列表的尾部,而是构造一个包含两个元素的列表,其中第一个元素是尾部。

谓词成功或失败。所以这里已经有一个 truefalse 了。您不需要为此添加额外的参数。如果谓词失败,它将在标准输出通道上打印 false(或 no)。

因此,我们可以通过将其重写为来解决此问题:

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

使用maplist/2

您可以使用 maplist/2 [swi-doc] here, and as predicate use atomic/1 [swi-doc]:

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