列出原子元素Swi-Prolog

时间:2019-01-30 17:53:31

标签: list prolog element atomic

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

例如:
[]是原子的

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

列出[[1], 2, 3]并不是因为[1]是复合词

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

这就是我试图做的。

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

1 个答案:

答案 0 :(得分:1)

问题是您在此处定义了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]这里,并且作为谓词使用atomic/1 [swi-doc]

check_atomic(L) :-
    maplist(atomic, L).