gpt4 book ai didi

list - Prolog:使用递归在多个列表上成对兼容

转载 作者:行者123 更新时间:2023-12-02 06:15:46 25 4
gpt4 key购买 nike

所以我有一个谓词:

compatible([],_).
compatible(_,[]).
compatible([HA|TA],[HB|TB]) :-
HA \= HB,
compatible(TA,TB).

它目前接受两个列表并确定它们是否成对兼容,如果是则返回 true,否则返回 false。

例如:

?- compatible([8,2,6,3,67],[7,4,7,4,3]).
true

?- compatible([8,2,6,3,3],[7,4,7,4,3]).
false.

第二次调用返回 false,因为 3 在两个列表的第 5 个位置。

我的问题是如何修改这个谓词,以便它递归地检查 2 个以上的列表。潜在地,谓词可以检查包含 1、2、3、4、5 甚至无限列表的列表列表。如果任何列表彼此不兼容,它将返回 false。

因此我可以像这样检查 3 个列表:

let Y = [[8,2,6,3,67],[7,4,7,4,3],[1,3,42,1,52]]
then...

?- compatible(Y).
true

let Z = [[8,2,6,3,67],[7,4,7,4,3],[1,3,6,1,52]]
then...

?- compatible(Z).
false.

第二次调用失败,因为 6 位于列表 1 和 3 的第 3 个位置。

最佳答案

如果所有子列表的长度相同,并且元素总是整数,您可以根据 library(clpfd) 提供的两个谓词来定义您的问题。 :

compatible(Ls) :-
transpose(Ls, T),
maplist(all_different, T).

有了这个定义,你的例子:

?- compatible([[8,2,6,3,67],[7,4,7,4,3],[1,3,42,1,52]]).
true.

?- compatible([[8,2,6,3,67],[7,4,7,4,3],[1,3,6,1,52]]).
false.

如果子列表可以有不同的长度,你应该首先找到最短的,然后将其余的剪切到那个长度。

如果列表的元素可以是任意的 Prolog 项,请查看 at this question .简而言之:

all_different_terms([]).
all_different_terms([H|T]) :-
maplist(dif(H), T),
all_different_terms(T).

注意使用 dif/2 而不是 \=/2

?- compatible_terms([[a,b,c],[d,e,f],[g,h,i]]).
true.

?- compatible_terms([[a,b,c],[d,e,f],[a,h,i]]).
false.

all_different_terms/1 的定义还应该让您了解如何实现您的初始建议,重用您已经定义的谓词 compatible/2:

all_compatible([]).
all_compatible([H|T]) :-
maplist(compatible(H), T),
all_compatible(T).

关于list - Prolog:使用递归在多个列表上成对兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33029169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com