我正在尝试编写一些 Prolog 代码来获取列表,例如:
[[park, joe], [park, bob], [park, kate], [school, joe], [zoo, amy], [zoo, ted]].
并将列表组织成以下形式:
[[park,[joe, bob, kate]], [school,[joe]], [zoo,[amy, ted]]].
可以假设每个元素的所有匹配头(park = park,zoo = zoo)在列表中彼此直接相邻,因为我创建列表的代码按字母顺序对其进行排序。我似乎无法弄清楚如何完成此操作并且似乎每次都会出错 :(。下面是我到目前为止在最后一个状态下没有错误运行的代码,我将尝试解释我是什么思考。
merge([],[]).
merge([First|Rest], Z) :-
merge(Rest, U),
[Meet1, Person1] = First,
( =(U, []) -> % beginning case from recursion, U is empty
Meet2 = [],
Person2 = [];
[[Meet2|Person2]|_] = U),
( =(Meet1, Meet2) -> % Case of matching heads, combine the tails
print('Match '),
append([First], U, Z);
print('No-match '), % otherwise, not matching
append([First], U, Z) ).
所以我想做的是使用追加将所有更改添加到 U 并使用 Z 将其返回到控制台。例如,
( =(Meet1, Meet2) ->
append(Person1, Person2, Combpersons),
append([Meet1], [Combpersons], T),
append(T, U, Z);
...no match code here..).
但是,当我尝试在我放在此处的第一个代码块中更改或添加这样的追加时,我的代码总是以 false 过早结束。即使是将 append([First], U, Z) 转换为 append([Meet1], U, Z) 之类的更改也会使我的代码以 false 结尾,我不明白为什么。任何有关创建解决方案的帮助/提示都将不胜感激。
最佳答案
我认为学习任何语言都是一个过程,其中低级和高级问题必须交织。到目前为止,您正在学习基本语法。但是为什么要使用这种不可读的结构呢?当然,任何编程语言都建立在一组模式之上,通常包含在 libraries 中。 .考虑
l2p([A,B],A-B).
?- maplist(l2p,[[park, joe], [park, bob], [park, kate], [school, joe], [zoo, amy], [zoo, ted]], L),group_pairs_by_key(L,G).
L = [park-joe, park-bob, park-kate, school-joe, zoo-amy, zoo-ted],
G = [park-[joe, bob, kate], school-[joe], zoo-[amy, ted]].
无论如何,这里是你的代码重构:
merge([],[]).
merge([[Meet, Person]|Rest], Z) :-
merge(Rest, U),
( U = []
-> % beginning case from recursion, U is empty
Z = [[Meet, [Person]]]
; U = [[Meet, Persons] | Rest1]
-> % Case of matching heads, combine the tails
Z = [[Meet, [Person | Persons]] | Rest1]
; % otherwise, not matching
Z = [[Meet, [Person]] | U]
).
关于list - 在序言中重新组织列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27292167/