list - 序言检查表

标签 list prolog

我有以下代码:

check([],[]).
check([X], [Y]) :-
    X > 0,
    Y is 1.
check([X], [Y]) :-
    X =:= 0,
    Y is 0.
check([L1|Tail], [L2|Tail2]) :-
    L1 > 0,
    L2 is 1,
    check(Tail,Tail2).
check([L1|Tail], [L2|Tail2]) :-
    L1 =:= 0,
    L2 is 0,
    check(Tail,Tail2).

谓词检查创建一个表,将所有大于 0 的项目替换为 1。 这个谓词适用于像这样的简单列表 L = [3,4,5,6,0] 并生成一个列表 L1 = [1,1,1,1,0].

我需要进行谓词检查以接受将列表作为项目的列表。

例如:L = [[2, 3, 4], [4, 0, 6], [5, 6, 3]]。列表的项目与项目列表的项目一样多。这意味着如果列表包含 3 个项目列表,则每个项目列表应包含 3 个项目。

最佳答案

对于列表中每个项目相同的关系,通常最好描述单个元素的关系,然后使用 maplist/3:

check(0, 0).
check(N, 1) :- N > 0.

示例查询:

?- maplist(check, [3,4,5,6,0], Ls).
Ls = [1, 1, 1, 1, 0] ;
false.

现在嵌套列表的情况转化为嵌套的 maplist/3:

?- maplist(maplist(check), [[2, 3, 4], [4, 0, 6], [5, 6, 3]], Ls).
Ls = [[1, 1, 1], [1, 0, 1], [1, 1, 1]] ;
false.

关于list - 序言检查表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8774417/

相关文章:

python - 将列表中的字符串乘以另一个列表中的数字,逐个元素

r - 如何使用 mutate 从 for 循环中的列表创建列

C++ list.unique() 会调整列表的大小吗?

prolog - Prolog 谓词中的随机优先级

prolog - 为什么这个序言程序会导致无限递归?

prolog - 列表中的唯一元素(Prolog)

python - 将元组列表的字典转换为数据框

r - 创建一个带有循环的矩阵列表并将它们合并到 R 中

recursion - Turbo Prolog 执行顺序

database - Prolog 做一个查询