gpt4 book ai didi

prolog - 下划线后跟数字而不是解决方案

转载 作者:行者123 更新时间:2023-12-04 08:36:07 25 4
gpt4 key购买 nike

我正在尝试解决爱因斯坦之谜的一个版本。因此我定义了一些规则:

students(Students) :-
length(Students, 6),
member([manuel, _, _, _], Students),
member([tobias, _, pas, _], Students),
member([louise, _, _, _], Students),
member([sophia, _, _, _], Students),
member([hannes, 18, _, _], Students),
member([oliver, _, _, _], Students),
member([_, 18, _, _], Students),
member([_, 19, _, win], Students),
member([_, 20, stu, _], Students),
member([_, 21, _, _], Students),
member([_, 22, _, _], Students),
member([_, 23, _, _], Students),
member([_, _, ulm, _], Students),
member([_, _, fra, _], Students),
member([_, _, pas, _], Students),
member([_, _, hei, inf], Students),
member([_, _, aug, _], Students),
member([_, _, stu, _], Students),
member([_, _, _, win], Students),
member([_, _, _, wig], Students),
member([_, _, _, bwl], Students),
member([_, _, _, inf], Students),
member([_, _, _, gbm], Students),
member([_, _, _, rwi], Students).
当我测试它以查看到目前为止是否有任何错误时,我遇到了以下输出:
?- students(X).
X = [[manuel, 19, ulm, win], [tobias, 21, pas, _1574], [louise, 20, stu, _1604], [sophia, 22, fra, _1634], [hannes, 18, hei, inf], [oliver, 23, aug, _1694]]
X = [[manuel, 19, ulm, win], [tobias, 21, pas, _1350], [louise, 20, stu, _1380], [sophia, 22, fra, _1410], [hannes, 18, hei, inf], [oliver, 23, aug, _1470]]
X = [[manuel, 19, ulm, win], [tobias, 21, pas, _1350], [louise, 20, stu, _1380], [sophia, 22, fra, _1410], [hannes, 18, hei, inf], [oliver, 23, aug, _1470]]
X = [[manuel, 19, ulm, win], [tobias, 21, pas, _1350], [louise, 20, stu, _1380], [sophia, 22, fra, _1410], [hannes, 18, hei, inf], [oliver, 23, aug, _1470]]
...
由于需要更多规则来完全解决它,我期待着不止一种解决方案。但我很困惑为什么 wininf正确使用但 wig , bwl , rwigbm不是。
你能向我解释为什么会发生这种情况以及如何解决吗?
(不知道是不是方言的问题,于是在 https://swish.swi-prolog.org/example/examples.swinb网站上测试了下)

最佳答案

您没有为值指定域。因此,在某种程度上,所有变量都可以保持自由。您可以使用 permutation/2 例如指定名称仅限于 manuel , tobias , louise , sophia , hannes , 和 oliver :

students(Students) :-
Students = [
[manuel, AA, SA, TA],
[tobias, AB, SB, TB],
[louise, AC, SC, TC],
[sophia, AD, SD, TD],
[hannes, AE, SE, TE],
[oliver, AF, SF, TF]

],
member([tobias, _, pas, _], Students),
member([hannes, 18, _, _], Students),
member([_, 19, _, win], Students),
member([_, 20, stu, _], Students),
member([_, _, hei, inf], Students),
permutation([AA, AB, AC, AD, AE, AF], [18, 19, 20, 21, 22, 23]),
permutation([SA, SB, SC, SD, SE, SF], [ulm, fra, pas, hei, aug, stu]),
permutation([TA, TB, TC, TD, TE, TF], [win, wig, bwl, inf, gbm, rwi]).
我们在这里可以设置已经固定的名字的顺序,因为没有像“Manuel is located next to a person with age 20”这样的谓词,因此这是一种我们可以删除的对称形式(或者你可以使用 permutation/2 如果必要的)。
此外,我们不必提及任何仅限制域的约束。我们可以用 member/2 做到这一点,但它可能效率较低,而且我们必须完全指定域,而不仅仅是像 member([hannes, 18, _, _], Students) 这样的情况。 ,因为这在 18 岁的汉内斯之间建立了联系。
这给了我们 44'928 个解决方案,如果我们允许任意顺序的学生,我们必须将其乘以 4! = 24,所以有 1'078'272 个解。

关于prolog - 下划线后跟数字而不是解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64792285/

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