Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog中的列表_Prolog - Fatal编程技术网

Prolog中的列表

Prolog中的列表,prolog,Prolog,我对Prolog中的列表有问题。 例如,我有以下事实: fact(1, 'hello'). fact(2, 'boy'). fact(3, 'hello'). fact(4, 'girl'). 和一个由(字符,Id)这样的对组成的列表: 我的目标是返回如下列表: newList(['hello', boy'], ['hello', 'girl']). list(['hello', 'boy'], ['hello', 'girl']). 编辑: 第一个列表必须拆分为多个共享相同字符的列表

我对Prolog中的列表有问题。 例如,我有以下事实:

fact(1, 'hello').
fact(2,  'boy').
fact(3, 'hello').
fact(4, 'girl').
和一个由(字符,Id)这样的对组成的列表:

我的目标是返回如下列表:

newList(['hello', boy'], ['hello', 'girl']).
list(['hello', 'boy'], ['hello', 'girl']).
编辑: 第一个列表必须拆分为多个共享相同字符的列表

list([b, 1, b, 2], [g, 3, g, 4]).
list([1, 2], [3, 4]).
然后,应删除该字符

list([b, 1, b, 2], [g, 3, g, 4]).
list([1, 2], [3, 4]).
用相应的原子替换id,如下所示:

newList(['hello', boy'], ['hello', 'girl']).
list(['hello', 'boy'], ['hello', 'girl']).

完全是个奇怪的问题。如果您愿意给出一些上下文,通常您可能会得到一个关于如何在Prolog中做事情的更有意义的答案

无论如何:

首先,如果这确实是一个对列表,则将其表示为:

char_id([b-1, b-2, g-3, g-4]).
如果你想按程序进行

flat_to_pairs([], []).
flat_to_pairs([A,B|Flat], [A-B|Pairs]) :- flat_to_pairs(Flat, Pairs).
然后,您可以使用:

?- group_pairs_by_key([b-1, b-2, g-3, g-4], G).
G = [b-[1, 2], g-[3, 4]].
然后,您可以将ID映射到相应的单词:

collect_words([], []).
collect_words([C-IDs|ID_Groups], [C-Words|Word_Groups]) :-
    maplist(fact, IDs, Words),
    collect_words(ID_Groups, Word_Groups).
作为奖励,您的单词用首字母标记


但正如我所说的,这一切在许多层面上都是错误的。

这完全是一个奇怪的问题。如果您愿意给出一些上下文,通常您可能会得到一个关于如何在Prolog中做事情的更有意义的答案

无论如何:

首先,如果这确实是一个对列表,则将其表示为:

char_id([b-1, b-2, g-3, g-4]).
如果你想按程序进行

flat_to_pairs([], []).
flat_to_pairs([A,B|Flat], [A-B|Pairs]) :- flat_to_pairs(Flat, Pairs).
然后,您可以使用:

?- group_pairs_by_key([b-1, b-2, g-3, g-4], G).
G = [b-[1, 2], g-[3, 4]].
然后,您可以将ID映射到相应的单词:

collect_words([], []).
collect_words([C-IDs|ID_Groups], [C-Words|Word_Groups]) :-
    maplist(fact, IDs, Words),
    collect_words(ID_Groups, Word_Groups).
作为奖励,您的单词用首字母标记


但正如我所说,这在很多层面上都是错误的。

好吧,这里有一个简单的序言定义

list([], []).
list([S|R], [L|T]) :-
    capture(S, [S|R], L, Q),
    list(Q, T).

capture(S, [S,I|R], [N|Ns], Q) :-
    !, fact(I, N),
    capture(S, R, Ns, Q).
capture(_, Q, [], Q).
注:切割是为了确保程序的正确性。 它产生

?- list([b, 1, b, 2, g, 3, g, 4], R).
R = [[hello, boy], [hello, girl]].

这是一个简单的序言定义

list([], []).
list([S|R], [L|T]) :-
    capture(S, [S|R], L, Q),
    list(Q, T).

capture(S, [S,I|R], [N|Ns], Q) :-
    !, fact(I, N),
    capture(S, R, Ns, Q).
capture(_, Q, [], Q).
注:切割是为了确保程序的正确性。 它产生

?- list([b, 1, b, 2, g, 3, g, 4], R).
R = [[hello, boy], [hello, girl]].

你的事实和最初的清单是如何转化为你想要的结果的还不是很清楚。它背后的逻辑是什么?希望现在能更好地解释这个问题。
fact
为什么用“boy”和“girl”代替“b”和“g”?此外,这个方案中似乎有一些隐含的知识,即偶数是性别,奇数是其他东西。你的事实和最初的列表如何转化为你想要的结果还不是很清楚。它背后的逻辑是什么?希望现在能更好地解释这个问题。
fact
为什么用“boy”和“girl”代替“b”和“g”?此外,这个方案中似乎有一些隐含的知识,即偶数是性别,奇数是其他东西。