![]() |
1
4
对于现有答案,我想添加一个使用 CLP(FD)约束 .
我将使用的两个构建块是
第一,
num_correct(Vs, Ns, Num) :- foldl(num_correct_(Vs), Ns, 0, Num). num_correct_(Vs, Num, N0, N) :- foldl(eq_disjunction(Num), Vs, 0, Disjunction), Disjunction #<==> T, N #= N0 + T. eq_disjunction(N, V, D0, D0 #\/ (N #= V)). 示例查询: ?- num_correct([1,2,3], [3,5], Num). Num = 1. 与纯关系的特征一样,这也适用于更一般的查询,例如: ?- num_correct([A], [B], Num). B#=A#<==>Num, Num in 0..1.
第二,我使用
num_well_placed(Vs, Ns, Num) :- maplist(num_well_placed_, Vs, Ns, Bs), sum(Bs, #=, Num). num_well_placed_(V, N, B) :- (V #= N) #<==> B.
?- num_well_placed([8,3,4], [0,3,4], Num). Num = 2. 下面的谓词将这两个简单地结合在一起: num_correct_placed(Vs, Hs, C, P) :- num_correct(Vs, Hs, C), num_well_placed(Vs, Hs, P). 因此,整个谜题可以表述如下: lock(Vs) :- Vs = [_,_,_], Vs ins 0..9, num_correct_placed(Vs, [6,8,2], 1, 1), num_correct_placed(Vs, [6,1,4], 1, 0), num_correct_placed(Vs, [2,0,6], 2, 0), num_correct_placed(Vs, [7,3,8], 0, 0), num_correct_placed(Vs, [7,8,0], 1, 0). 在这种情况下需要: ?- lock(Vs). Vs = [0, 4, 2]. 而且,如果我 泛化 lock(Vs) :- Vs = [_,_,_], Vs ins 0..9, num_correct_placed(Vs, [6,8,2], 1, 1), num_correct_placed(Vs, [6,1,4], 1, 0), num_correct_placed(Vs, [2,0,6], 2, 0), num_correct_placed(Vs, [7,3,8], 0, 0), * 那么唯一的解决方案可以 不经搜索就确定: ?- lock(Vs). Vs = [0, 4, 2]. 事实上,我甚至可以 去掉倒数第二个提示: lock(Vs) :- Vs = [_,_,_], Vs ins 0..9, num_correct_placed(Vs, [6,8,2], 1, 1), num_correct_placed(Vs, [6,1,4], 1, 0), num_correct_placed(Vs, [2,0,6], 2, 0), *
仍然
这个解决方案是独一无二的,尽管我现在必须使用
?- lock(Vs), label(Vs). Vs = [0, 4, 2] ; false. |
![]() |
2
2
我希望有更好的方法但是。。。 您可以实现“一个数字是正确的,位置正确”,如下所示
对于“两个数字是正确的,但位置错误”,你可以写
而且,对于“没有什么是正确的”,变得简单
现在你可以把所有的东西放在一起写了
|
![]() |
3
2
所以,和所有的问题一样,我倾向于写一个通用的解算器,而不是一个特定的解算器。从 mastermind implementation 我不久前写了一篇文章(由这里的一个问题引出)我提出了以下内容:
|
![]() |
4
1
我不确定我需要解释这么多。生成所有的可能性,然后编写约束条件。
结果如下:
|
![]() |
Sam · 如何在Swi Prolog中对元组列表排序 6 年前 |
|
davo · 序言:delete谓词如何提供列表的开头 6 年前 |
|
Zeph · 在Prolog中添加到列表列表 6 年前 |
|
Deeps · 在prolog中截断浮点数 6 年前 |
|
Anthony Gauthier · 分析不同规则中的规则体 6 年前 |
![]() |
quixote · 如何在swi prolog中删除命令历史记录 6 年前 |
|
Walker · Prolog比较列表[关闭] 6 年前 |
![]() |
user7303261 · 在prolog中运行main 6 年前 |
![]() |
MasterYork42 · Prolog逻辑难题不起作用? 6 年前 |