gpt4 book ai didi

prolog - Prolog 中的锁挑战

转载 作者:行者123 更新时间:2023-12-03 23:38:12 36 4
gpt4 key购买 nike

我刚开始学习序言,我一直在努力解决这个难题:

Alt

我尝试添加一些规则,例如 http://swish.swi-prolog.org/example/houses_puzzle.pl但我想不出解决方案。

到目前为止我尝试了什么:

% Render the houses term as a nice table.
:- use_rendering(table,
[header(h('N1', 'N2', 'N3'))]).
numbers(Hs) :-
length(Hs, 1),
member(h(6,8,2), Hs),
member(h(6,1,4), Hs),
member(h(2,0,6), Hs),
member(h(7,3,8), Hs),
member(h(7,8,0), Hs),
correct_and_placed(6, 8, 2, Hs).

correct_and_place(A, B, C, R).

但我什至不知道如何编写一个规则来检查一个数字是否正确并且在正确的位置。

最佳答案

对于现有的答案,我想使用 添加一个版本CLP(FD) 约束 .

我将使用的两个构建 block 是 num_correct/3num_well_placed/3 .

一、num_correct/3 ,将两个整数列表与公共(public)元素的数量相关联:

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),
析取 #<==> T,
N #= N0 + T。

eq_disjunction(N, V, D0, D0 #\/(N #= V))。

示例查询:

?- num_correct([1,2,3], [3,5], Num)。
数量 = 1。

作为纯关系的特征,这也适用于更一般的查询,例如:

?- num_correct([A], [B], Num)。
B#=A#<==>数量,
数字在 0..1。

二、我用num_well_placed/3 ,它将两个整数列表与对应元素相等的索引数相关联:

num_well_placed(Vs, Ns, Num) :-
map 列表(num_well_placed_,Vs,Ns,Bs),
总和(Bs,#=,数字)。

num_well_placed_(V, N, B) :- (V #= N) #<==> B.

再次,示例查询和答案:

?- num_well_placed([8,3,4], [0,3,4], Num)。
数量 = 2。

以下谓词简单地结合了这两者:

num_correct_placed(Vs, Hs, C, P) :-
num_correct(Vs, Hs, C),
num_well_placed(Vs, Hs, P)。

因此,整个谜题可以表述如下:

锁定(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)。

完全没有搜索 在这种情况下需要:

?- 锁定(Vs)。
Vs = [0, 4, 2]。

此外,如果我 一概而论最后一个提示,即,如果我写:

锁定(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)。

那么唯一的解决方案仍然可以在没有搜索的情况下确定:

?- 锁定(Vs)。
Vs = [0, 4, 2]。

事实上,我什至还可以去掉倒数第二个提示:

锁定(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)。

并且解决方案仍然是独一无二的,尽管我现在必须使用 label/1找到它:

?- 锁(Vs),标签(Vs)。
Vs = [0, 4, 2] ;
错误的。

关于prolog - Prolog 中的锁挑战,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42373479/

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