列出原子元素 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
(带有一个参数)。此外,不是传递列表的尾部,而是构造一个包含两个元素的列表,其中第一个元素是尾部。
谓词成功或失败。所以这里已经有一个 true
或 false
了。您不需要为此添加额外的参数。如果谓词失败,它将在标准输出通道上打印 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).
我被这个问题困住了。我想检查列表中的所有元素是否都是原子的,但我无法解决。
例如:
[]
是原子的
列表[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
(带有一个参数)。此外,不是传递列表的尾部,而是构造一个包含两个元素的列表,其中第一个元素是尾部。
谓词成功或失败。所以这里已经有一个 true
或 false
了。您不需要为此添加额外的参数。如果谓词失败,它将在标准输出通道上打印 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).