有没有比制定新规则来更改映射列表变量顺序更好的方法?

2024-01-08

我编写了一个程序,定义“完整”数据表、一组列标题(功能)、聚合函数和聚合表之间的关系。

一个查询示例:

 ?- data(D), fulltable_aggfunction_sets_aggtable(D,mean,[[a,b,c],[d,e,f]],AggTable), 
print_data(D),print_data(AggTable).

[a,b,c,d,e,f,g,class] 
[1,1,1,1,1,1,1,0] 
[2,3,4,5,4,2,1,0] 
[3,1,3,4,6,7,8,1] 
[1,2,3,6,1,1,2,1] 

[feature(1,mean,[a,b,c]),feature(2,mean,[d,e,f])] 
[1,1] 
[3,3.6666666666666665] 
[2.3333333333333335,5.666666666666667] 
[2,2.6666666666666665] 

D = [[a, b, c, d, e, f, g, class], [1, 1, 1, 1, 1, 1, 1|...], [2, 3, 4, 5, 4, 2|...], [3, 1, 3, 4, 6|...], [1, 2, 3, 6|...]],
AggTable = [[feature(1, mean, [a, b, c]), feature(2, mean, [d, e, f])], [1, 1], [3, 3.6666666666666665], [2.3333333333333335, 5.666666666666667], [2, 2.6666666666666665]] 

以下是我的代码:

fulltable_aggfunction_sets_aggtable(Full,Func,Sets,Aggtable):-
 Full =[Features|Data],
 flist_sets_indexs(Features,Sets,Indexs),
 maplist(indexs_flist_sets(Indexs),Data,Datasplits),
 maplist(aggfun_listoflists_values(Func),Datasplits,AggData),
 list_indexes(Sets,SetIndex),
 maplist(name_set_id_feature(Func),Sets,SetIndex,FeatureNames),
 append([FeatureNames],AggData,Aggtable).

name_set_id_feature(Func,Set,Id,feature(Id,Func,Set)).

list_indexes(List,Indexes):-
 findall(I,nth1(I,List,_),Indexes).

aggfunc_list_value(sum,List,Value):-
 sumlist(List,Value).

aggfunc_list_value(mean,List,Value):-
 sumlist(List,Sum),
 length(List,L),
 Value is Sum/L.

aggfun_listoflists_values(Fun,ListsofLists,Values):-
 maplist(aggfunc_list_value(Fun),ListsofLists,Values).

my_nth0(List,Elem,I):- nth0(I,List,Elem).

indexs_flist_sets(I,F,S):-flist_sets_indexs(F,S,I).

flist_sets_indexs(Features,Sets,Indexs):-
 maplist(flist_set_indexes(Features),Sets,Indexs).

flist_set_indexes(Features,Set,Indexs):-
 maplist(my_nth0(Features),Set,Indexs).

%aux
print_data(Data_set):-
 maplist(print_line,Data_set).

print_line(Data_line):-
 format("~w ~n",[Data_line]).

data(Data):-
 Data =[[a,b,c,d,e,f,g,class],
       [1,1,1,1,1,1,1,0],
       [2,3,4,5,4,2,1,0],
       [3,1,3,4,6,7,8,1],
       [1,2,3,6,1,1,2,1]].

在我的代码中,我有这两行,它们只是重新排序参数,以便我可以将这些规则传递到映射列表中。

my_nth0(List,Elem,I):- nth0(I,List,Elem).

indexs_flist_sets(I,F,S):-flist_sets_indexs(F,S,I).

有一个更好的方法吗?在这种情况下我如何使用maplist以避免定义这些规则?


在SWI-Prolog中有库(yall http://www.swi-prolog.org/pldoc/man?section=yall)和图书馆(lambda http://www.swi-prolog.org/pack/list?p=lambda).

例如,使用库(yall)

flist_set_indexes(Features,Set,Indexs):-
 maplist({Features}/[Elem,I]>>nth0(I,Features,Elem),Set,Indexs).

print_data(Data_set):-
 maplist([Data_line]>>format("~w ~n",[Data_line]),Data_set).

使用第二个时

:- use_module(library(lambda)).

flist_set_indexes(Features,Set,Indexs):-
 maplist(\Elem^I^nth0(I,Features,Elem),Set,Indexs).

%aux
print_data(Data_set):-
 maplist(\Data_line^format("~w ~n",[Data_line]),Data_set).

图书馆也有类似的功能。但请注意,你们需要“捕获”Features。库(lambda)在之后可用

?- pack_install(lambda).

当库(yall)自动加载时

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有比制定新规则来更改映射列表变量顺序更好的方法? 的相关文章

  • 如何实现 not_all_equal/1 谓词

    如何实施not all equal 1谓词 如果给定列表包含至少 2 个不同的元素 则该谓词成功 否则失败 这是我的尝试 不是很纯粹的尝试 not all equal L member H1 L member H2 L H1 H2 gt t
  • 寻找最大最小值集合

    我正在尝试编写一个 天真的或半天真的 程序 给定一组元素和许多玩家将其划分为这个数量的玩家 并且对于每个这样的划分取最小值 按总和 子集 然后 我想计算所有这些最小除法的最大值 这被称为https en wikipedia org wiki
  • 如何从序言中的列表中删除列表?

    我想在序言中实现以下问题 Given L1 1 2 3 4 and L2 2 3 4 调用名为remove list L1 L2 L 的函数将从L1中删除L2 所以L将是 1 但是 如果第二个列表的元素与 L1 中的元素顺序不同 或者更准确
  • 如何在Prolog中编写cmp_list/3函数?

    Write a predicate cmp list 3 the first 2 arguments are 2 lists and the last one is Comparison which means ge lt le or gt
  • 井字游戏的极小极大

    我正在尝试用简单的极小极大算法来解决井字游戏 简单 但应该涵盖很多语言 到目前为止我所拥有的 该板表示为 9 个 未绑定 变量的数组 这些变量可以设置为x or o 获胜条件基本上是 win Player X1 X2 X3 X1 Playe
  • 导入 csv 文件数据以填充 Prolog 知识库

    我有一个 csv 文件example csv其中包含两列 标题为 var1 和 var2 我想填充一个最初为空的 Prolog 知识库文件import pl具有重复的事实 而每一行example csv处理方式相同 fact A1 A2 f
  • 计算序言中列表的排列

    在 序言艺术 第二版中有一个问题 您应该定义一个谓词 Even permutation Xs Ys 和类似的奇数排列 当您查询时 例如 Even permutation 1 2 3 2 3 1 和 odd permutation 1 2 3
  • 如何在 Prolog 中解决这个算术表达式难题?

    我有一个编程问题 https blog svpino com 2015 05 08 solution to problem 5 and some other thoughts about this type of questions htt
  • Prolog:子句在源文件中不在一起

    我有这段代码 Family tree female pen male tom male bob female liz female pat female ann male jim parent pam bob parent tom bob
  • Prolog 展平列表

    flatten A B R islist A gt flatten A R1 R R1 write A append A R1 R flatten B R1 flatten X X islist 这是我写的代码 但我有奇怪的问题 I get
  • 在 SWI Prolog 中使用 process_create/3 使用命令提示符或 shell 时出错

    在 Windows 7 上 当我在 SWI Prolog 中使用 process create 3 打开 Notepad exe 等应用程序时 记事本将打开 但是 它不适用于使用命令提示符的应用程序 例如 当我尝试打开命令提示符窗口时 使用
  • 从终端查询不会打印任何内容

    当在命令行中运行时 这 swipl g write 42 t halt 打印 42 到STDOUT正如预期的那样 然而 这 swipl g X 42 t halt 不打印任何内容 它只是返回 我如何让它打印在 REPL 中打印的内容 即X
  • 将 X 插入到排序列表中的正确位置

    在序言中 如何将 X 插入到排序列表中的正确位置 我的尝试 insert X Y Rest X Y Rest X lt Y insert X Rest BiggerRest 您的方向是正确的 但您需要解决这三个问题 insert X X i
  • SWI Prolog 转义引号

    我需要在序言中将 放在字符串周围 我从另一个程序获取输入 看起来我无法转义该程序中的 因此我必须在序言中添加 否则序言语句将不起作用 感谢您的帮助 为了讨论strings https stackoverflow com a 39922411
  • 序言中的“如果”?

    有没有办法在序言中执行 if 操作 例如如果变量为 0 则执行一些操作 将文本写入终端 甚至不需要 else 但我找不到 if 的任何文档 是的 ISO Prolog 中有这样一个控制结构 称为 gt 你像这样使用它 condition g
  • json 获取 prolog 谓词

    我试图在序言中创建这个谓词 谓词json get 3可以定义为 json get JSON obj Fields Result 这是正确的 当Result可以通过以下方式恢复 中的字段链Fields 列表 从JSON obj 一个字段 代表
  • Prolog真的基于封闭世界假设吗?

    在下面封闭世界假设 https en wikipedia org wiki Closed world assumption 目前未知的事实是错误的 Prolog 的语义通常被认为遵循封闭世界假设 例如 here https cstheory
  • 简单的布尔表达式测试

    user compiling user for byte code formula 0 P Q P Q P user compiled 2 lines read 768 bytes written 37208 ms yes formula
  • prolog跟踪如何使用

    跟踪prolog程序时如何进行第二步 例如 我想跟踪以下简单程序 length1 0 length1 X Xs N length1 Xs N1 N is N1 1 我跟踪程序 trace length 1 2 3 N Call 7 leng
  • 冒号 (:) 在 Swi-Prolog 中到底代表什么?

    我无法明确找到 代表什么prolog http www swi prolog org pldoc doc for object op 3 在交互模式下您可以看到以下证据 display a b a b true display a b c

随机推荐