list - 在序言中重新组织列表

标签 list prolog

我正在尝试编写一些 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/

相关文章:

list - 从列表中更改 containerColor

r - 处理在操作时对于 RAM 来说太大的大列表

reflection - 如何列出具有特定原子的所有谓词?

java - 尝试安装 jpl 库时出错。 jpl.dll : Can't find dependent libraries

c++ - 在 C++ 中实现列表位置定位器?

c++ - 检查链表中的所有值是否至少重复两次

python - 需要帮助思考在 Python 中以整数除法拆分列表

prolog - 如何使列表构造函数(例如 .(a,[]) == [a].)在 Prolog 中工作?

Prolog中的ListsfromList函数

Prolog,寻找最佳匹配