gpt4 book ai didi

prolog - 序言中的过滤器列表

转载 作者:行者123 更新时间:2023-12-04 16:42:24 30 4
gpt4 key购买 nike

我正在尝试将代码从 Haskell 重写为 Prolog。

count :: Eq a => a -> [a] -> Int
count x = length . filter (x==)

f :: [Integer] -> [Integer]
f [] = []
f list = filter (\x -> count x list == 1) list

此代码返回包含在列表中仅出现一次的元素的列表。
所以如果我有列表 [1,1,2,2,3,4,4,5]此函数返回 [3,5]我试图在 Prolog 中找到过滤器构造,但似乎没有这样的东西。如何在 Prolog 中制作类似的功能?

最佳答案

对于现有的答案,我想添加一个相当的答案 一般从某种意义上说,您可以在多个方向上使用它。

积木:list_element_number/3
我从以下谓词开始,定义一个 关系之间:

  • 列表Ls0
  • 一个元素 E
  • 号码N E 的出现次数在 Ls0

  • 这里是:

    list_element_number(Ls0, E, N) :-
    tfilter(=(E), Ls0, Ls),
    长度(Ls,N)。

    此解决方案使用 tfilter/3来自 library(reif) .谓词包含函数 count你已经发布了。与函数相比,此谓词的主要好处是该谓词不仅可以用于 Haskell 也可以轻松完成的那些情况,例如:

    ?- list_element_number([a,b,c], a, N)。
    N = 1。

    不,我们也可以在其他方向使用它,例如:

    ?- list_element_number([a,b,c], X, 1).
    X = 一个;
    X = b;
    X = c;
    错误的。

    甚至:

    ?- list_element_number([a,b,E], X, 2).
    E = X, X = a ;
    E = X, X = b ;
    错误的。

    甚至:

    ?- list_element_number([A,B,C], X, 3).
    A = B, B = C, C = X ;
    错误的。

    甚至在 最一般的情况 ,其中所有参数都是新变量:

    ?- list_element_number(Ls, E, N)。
    ls = [],
    N = 0 ;
    Ls = [E],
    N = 1 ;
    Ls = [E, E],
    N = 2 ;
    Ls = [E, E, E],
    N = 3。

    我们可以像这样公平地列举所有的答案:

    ?- 长度(Ls, _), list_element_number(Ls, E, N)。
    ls = [],
    N = 0 ;
    Ls = [E],
    N = 1 ;
    Ls = [_160],
    N = 0,
    差异(E,_160);
    Ls = [E, E],
    N = 2。

    主谓词: list_singletons/2
    使用这个构建块,我们可以定义 list_singletons/2如下:

    list_singletons(Ls, Singles) :-
    tfilter(count_one(Ls), Ls, Singles)。

    count_one(Ls, E, T) :-
    list_element_number(Ls, E, Num),
    cond_t(Num=1, true, T)。

    这使用 cond_t/3和(再次) tfilter/3来自 library(reif) .

    示例查询

    以下是一些示例查询。首先,您发布的测试用例:

    ?- list_singletons([1,1,2,2,3,4,4,5], 单打)。
    单打 = [3, 5]。

    它按需要工作。

    现在一个涉及变量的案例:

    ?- list_singletons([A,B], Singles)。
    A = B,
    单打 = [] ;
    单打 = [A, B],
    差异(A,B)。

    在回溯时,会生成所有可能性:要么 A = B成立,在这种情况下,没有元素只出现一次。或 A不同于 B ,在这种情况下,两者都是 AB恰好发生一次。

    作为上述查询的特例,我们可以发布:

    ?- list_singletons([A,A], Singles)。
    单打 = []。

    作为概括,我们可以发布:

    ?- 长度(Ls, _), list_singletons(Ls, Singles)。
    Ls = 单打, 单打 = [] ;
    Ls = 单例,单例 = [_7216] ;
    ls = [_7216, _7216],
    单打 = [] ;
    Ls = 单打,单打 = [_7828, _7834],
    差异(_7828,_7834);
    Ls = [_7216, _7216, _7216],
    单打 = [] ;
    Ls = [_7910, _7910, _7922],
    单打 = [_7922],
    差异(_7910,_7922)。

    享受这种关系的一般性,通过 获得.

    关于prolog - 序言中的过滤器列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44011598/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com