Prolog列表中相同数字的最大值为2

Prolog列表中相同数字的最大值为2,prolog,sudoku,Prolog,Sudoku,让我们直截了当地说吧。 我想自己做一个数独游戏(与学校无关)。我一直在寻找一些方法来让它发挥作用,我遇到了一个问题,也许更多的人都遇到了 因为在一行或一列中可能有相同数字的倍数,例如,如果数独是10 x 10,并且u必须填写从1到5的数字,那么固溶体将是1,2,1,3,2,3,4,5,4,5。因为所有的数字都被使用,最小值和最大值都是2。现在问题仍然存在,我如何编写一个谓词,它接受一个列表并根据列表中的数字返回True或false 因为不可能使用内置谓词all_distinct,但可能看起来是这

让我们直截了当地说吧。 我想自己做一个数独游戏(与学校无关)。我一直在寻找一些方法来让它发挥作用,我遇到了一个问题,也许更多的人都遇到了

因为在一行或一列中可能有相同数字的倍数,例如,如果数独是10 x 10,并且u必须填写从1到5的数字,那么固溶体将是1,2,1,3,2,3,4,5,4,5。因为所有的数字都被使用,最小值和最大值都是2。现在问题仍然存在,我如何编写一个谓词,它接受一个列表并根据列表中的数字返回True或false

因为不可能使用内置谓词all_distinct,但可能看起来是这样的,因为如果有2个相同的数字,如果你跟着我,那么现在就不用all distinct,而是all distinct

我试着做一些丑陋的固定谓词,但它并没有把我带到任何地方。 例如

我只是想说,如果A=B,那么它就不等于所有其他元素,但我仍然缺少,所有元素都需要有一个相同的其他元素

这里是我试过的另一个例子

    distinct_but_2(A,B,C,D) :-
(isEqual(A,B), isEqual(C,D), notIsEqual(A,C), notIsEqual(A,D));
(isEqual(A,C), isEqual(B,D), notIsEqual(A,B), notIsEqual(A,D));
(isEqual(A,D), isEqual(B,C), notIsEqual(A,B), notIsEqual(A,C)).
等质量(A,B):- A=B

不平等(A、B):- A\=B

查询的结果与_不同,但与_2(1,1,2,2)不同。 这可能是真的,但它说它还有另一个解决方案。这是假的。我就是不明白为什么

最后一个问题是,如果所有元素都有一个相同的min和max元素,那么是否可以生成一个谓词来检查列表


*请注意,我没有做一个接受列表的谓词,因为我试图让它对4个元素起作用,但我应该接受一个列表。

您没有说您使用的是哪个Prolog系统,但您似乎在寻找类似于
全局基数/{2,3}
,正如SWI所说:

下面是一个如何使用它的示例:

:- use_module(library(clpfd)).

two_each(Numbers, Vars) :-
    length(Numbers, Len),
    Len2 #= 2*Len,
    length(Vars, Len2),
    bagof(X-2, member(X, Numbers), Pairs),
    global_cardinality(Vars, Pairs).
查询:

?- two_each([1,2,3], Vars), label(Vars).
Vars = [1, 1, 2, 2, 3, 3] ;
Vars = [1, 1, 2, 3, 2, 3] ;
Vars = [1, 1, 2, 3, 3, 2] 
使用数独提示进行查询:

?- two_each([1,2,3], Vars), Vars=[_,3,_,1,1,_], label(Vars).
Vars = [2, 3, 2, 1, 1, 3] ;
Vars = [2, 3, 3, 1, 1, 2] ;
Vars = [3, 3, 2, 1, 1, 2].

您没有说明您使用的是哪种Prolog系统,但似乎您正在寻找类似于SWI的
global_cardinality/{2,3}

下面是一个如何使用它的示例:

:- use_module(library(clpfd)).

two_each(Numbers, Vars) :-
    length(Numbers, Len),
    Len2 #= 2*Len,
    length(Vars, Len2),
    bagof(X-2, member(X, Numbers), Pairs),
    global_cardinality(Vars, Pairs).
查询:

?- two_each([1,2,3], Vars), label(Vars).
Vars = [1, 1, 2, 2, 3, 3] ;
Vars = [1, 1, 2, 3, 2, 3] ;
Vars = [1, 1, 2, 3, 3, 2] 
使用数独提示进行查询:

?- two_each([1,2,3], Vars), Vars=[_,3,_,1,1,_], label(Vars).
Vars = [2, 3, 2, 1, 1, 3] ;
Vars = [2, 3, 3, 1, 1, 2] ;
Vars = [3, 3, 2, 1, 1, 2].

……但它说它还有另一个解决方案。这是假的。不完全是。在您的情况下,您的代码留下了一个选择点。这意味着Prolog在确定是否还有其他解决方案之前,还有其他的选择需要探索。在第一个解决方案之后,它会提示您搜索它们。如果再也找不到了,它会输出false。@潜伏者哦,是的,我忘了那个部分,你完全正确。谢谢你的提示:D…但它说它还有其他解决方案。这是假的。不完全是。在您的情况下,您的代码留下了一个选择点。这意味着Prolog在确定是否还有其他解决方案之前,还有其他的选择需要探索。在第一个解决方案之后,它会提示您搜索它们。如果找不到更多,它将输出false。@潜伏者哦,是的,我忘记了那个部分,你完全正确。谢谢你的提示:DDear@firefrorfiddle我确实没有提到我使用的是哪个Prolog系统。对不起,这对我来说是一种新语言,我不知道有多种变体。你以为我在找的是indd global_cardinality。很抱歉,我自己找不到。我不知道这是一件事,我真的试着去寻找它。在你的帮助下,我完成了我的程序,它非常难看,因为我还不熟悉Prolog中的递归,因此我必须指定我想要的所有东西,但它工作了,现在我的数独问题解决了。Thanku@HiddeGoossens听到这个消息我很高兴。:-)请随意给我的答案打勾。你说的随意给我的答案打勾是什么意思?我不太清楚你的意思:Daaah,很抱歉在这里发布新问题(完成)。亲爱的@firefrorfidle,我确实没有提到我使用的是哪种Prolog系统。对不起,这对我来说是一种新语言,我不知道有多种变体。你以为我在找的是indd global_cardinality。很抱歉,我自己找不到。我不知道这是一件事,我真的试着去寻找它。在你的帮助下,我完成了我的程序,它非常难看,因为我还不熟悉Prolog中的递归,因此我必须指定我想要的所有东西,但它工作了,现在我的数独问题解决了。Thanku@HiddeGoossens听到这个消息我很高兴。:-)请随意给我的答案打勾。你说的随意给我的答案打勾是什么意思?不太清楚你的意思:Daaah很抱歉在这里发布新问题(完成)。