我正在尝试处理任务,但是我确实在此部分停留。我需要做的是编写一个名为匹配的谓词,使用三个参数,所有列表。第三个列表必须包含前两个列表中包含相同值的位置的索引。我真的不知道从哪里开始,所以任何帮助将不胜感激!如何根据序言中的2个列表创建索引值列表
2
A
回答
2
第三列表必须包含在其中前两个列表包含相同的值的位置的索引。
第一重要:
第三列表必须包含在其中前两个列表包含相同的值位置的索引。
使用统一。作谓语:
same_value(X, X).
第三列表必须包含在其中前两个列表包含相同的值位置的索引。
lists_same_value([X|_], [Y|_]) :- same_value(X, Y). % succeed
lists_same_value([_|Xs], [_|Ys]) :- % skip head
lists_same_value(Xs, Ys). % recursive definition
简化和统一头:
lists_same_value([X|_], [X|_]). % succeed
lists_same_value([_|Xs], [_|Ys]) :- % skip head element
lists_same_value(Xs, Ys). % recursive definition
第三列表必须包含指数,其中前两个列表包含相同的值的立场。
为当前索引添加累加器,当头是相同元素时成功,并查看列表的其余部分。
lists_same_value_index([X|_], [X|_], N, N). % succeed
lists_same_value_index([_|Xs], [_|Ys], N0, N) :- % skip head element
succ(N0, N1), % next index
lists_same_value_index(Xs, Ys, N1, N). % recursive definition
实例化蓄电池:
lists_same_value_index(Xs, Ys, N) :-
lists_same_value_index(Xs, Ys, 0, N).
用它来与bagof
找到所有的解决方案:
?- bagof(N, lists_same_value_index([a,b,c,a,c,d,c], [a,c,c,a,d,d,c], N), Ns).
Ns = [0, 2, 3, 5, 6].
,没有这个是不一样的,与两个nth0
解决方案当然,请参阅:
?- numlist(1, 100, L), time(bagof(N, lists_same_value_index(L, L, N), Ns)).
% 314 inferences, 0.000 CPU in 0.000 seconds (98% CPU, 1785481 Lips)
L = [1, 2, 3, 4, 5, 6, 7, 8, 9|...],
Ns = [0, 1, 2, 3, 4, 5, 6, 7, 8|...].
?- numlist(1, 100000, L), time(bagof(N, lists_same_value_index(L, L, N), Ns)).
% 300,014 inferences, 0.052 CPU in 0.052 seconds (100% CPU, 5765387 Lips)
L = [1, 2, 3, 4, 5, 6, 7, 8, 9|...],
Ns = [0, 1, 2, 3, 4, 5, 6, 7, 8|...].
,然后用nth0
:
?- numlist(1, 100, L), time(findall(N, (nth0(N, L, E), nth0(N, L, E)), Ns)).
% 2,181 inferences, 0.001 CPU in 0.001 seconds (100% CPU, 3329847 Lips)
L = [1, 2, 3, 4, 5, 6, 7, 8, 9|...],
Ns = [0, 1, 2, 3, 4, 5, 6, 7, 8|...].
?- numlist(1, 100000, L), time(findall(N, (nth0(N, L, E), nth0(N, L, E)), Ns)).
% 1,667,166,681 inferences, 151.139 CPU in 151.244 seconds (100% CPU, 11030703 Lips)
L = [1, 2, 3, 4, 5, 6, 7, 8, 9|...],
Ns = [0, 1, 2, 3, 4, 5, 6, 7, 8|...].
1
由于@Capellic建议你可以使用的findall/3和NTH1/3谓词:
common_elemnts_pos(L1,L2,Pos):-
findall(X, (nth0(X,L1,Elem), nth0(X, L2, Elem)) , Pos).
上面只是说,找到所有位置X,在L1的元素是ELEM和元素在L2是ELEM,所以有相同的元素。
实施例:
?- common_elemnts_pos([1,3,4,5,7,9],[1,2,4,5,8,9],Pos).
Pos = [0, 2, 3, 5].
这也很容易做到象纯递归溶液:
common_elemnts_pos(L1,L2,Pos):- common_elemnts_pos(L1,L2,Pos,0).
common_elemnts_pos([],_,[],_).
common_elemnts_pos(_,[],[],_).
common_elemnts_pos([H|T],[H|T1],[CurrentPos|T2],CurrentPos):-
N_CurrentPos is CurrentPos+1,
common_elemnts_pos(T,T1,T2,N_CurrentPos).
common_elemnts_pos([H|T],[H1|T1],T2,CurrentPos):-
dif(H,H1), N_CurrentPos is CurrentPos+1,
common_elemnts_pos(T,T1,T2,N_CurrentPos).
实施例:
?- common_elemnts_pos([1,3,4,5,7,9],[1,2,4,5,8,9],Pos).
Pos = [0, 2, 3, 5] ;
Pos = [0, 2, 3, 5] ;
false.
?- common_elemnts_pos([1,3,4,5,7,9],[1,2,4,5,8,9],Pos).
Pos = [0, 2, 3, 5] ;
false.
在第一测试上面有两个相同的解决方案因为两个基本情况都是有效的。如果你只想要一个你可以替换:
common_elemnts_pos([],_,[],_).
common_elemnts_pos(_,[],[],_).
与基本情况:
common_elemnts_pos([],[_|_],[],_).
common_elemnts_pos(_,[],[],_).
相关问题
- 1. 如何根据列表中的索引创建两个新列表?
- 2. 根据sql中的另一个表列值创建表列
- 3. 如何根据现有列表的值创建新列表?
- 4. 根据另一个列表的值创建一个列表c#
- 5. 如何在序言中创建列表
- 6. 如何根据检索的数据创建多个列表?
- 7. 通过组合2个列表中的每个索引来创建列表
- 8. 如何根据功能从另一个列表创建列表?
- 9. 如何在python中创建一个数据框的索引和值的列表
- 10. 根据索引将Python列表拆分成几个列表
- 11. 如何根据2个布尔表列填充列表视图?
- 12. 根据索引列表,从列表中删除项目
- 13. 根据另外2个列表对齐2个python列表
- 14. 如何使用数据在表格上创建序列号列索引
- 15. SQL:如何根据同一表中的其他列的值创建新列
- 16. Python从列表中的特定索引创建列表
- 17. python索引错误:列表中的2个列表
- 18. 如何根据列表中的值过滤带linq的列表?
- 19. 如何根据长度在python中的一维列表中创建2D列表
- 20. 根据值获取列表中物品的索引
- 21. 如何根据C#中的索引拆分列表?
- 22. 根据列/表名选择索引
- 23. 如何根据索引列表替换多个矢量元素
- 24. 根据另一个列表返回列表中项目的索引,python
- 25. Python3根据索引的值中的一个值唯一化元组列表
- 26. 错误索引列表内的列表创建数据库列sqlite3 python
- 27. 2维python列表索引
- 28. 如何从2个表根据唯一值的列在一个表
- 29. Python:如何根据另一个列表排序列表
- 30. 如何从序列中的两个列表创建一个原子对列表?
你能给什么样的第三列表将包含一个例子吗?我想仔细检查一下我的理解,避免将您发送到错误的方向。 – jcolemang
您可以开始查看findall/3和nth1/3文档 – CapelliC