我陷入了这个问题。我想检查列表中的所有元素是否都是原子元素,但是我无法解决。
例如:
[]
是原子的
列表[1, 2, 3]
由原子元素组成
列出[[1], 2, 3]
并不是因为[1]
是复合词
对于我的问题,另一种更好的解决方案是,如果列表中有一个或多个复合元素,则使谓词失败。 有人可以帮我吗?
这就是我试图做的。
check_atomic([], true).
check_atomic([H | T], true) :-
atomic(H),
check_atomic([T, _ ]).
答案 0 :(得分:1)
问题是您在此处定义了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) :-
maplist(atomic, L).