斑马拼图 - 谁住在那个地板上



我有一个斑马/爱因斯坦类型的prolog拼图,与这里描绘的一个非常相似:

"建筑物"序言中的谜语。

谜语是:

有两座建筑物,每栋建筑物都有树公寓(每层公寓一间公寓(:一间3个房间的公寓,一个4个房间之一和5个房间之一。

达娜(Dana(,乔尼(Joni(和诺亚(Noah(居住在1号建筑物中。

乔尼(Joni(的公寓比达娜(Dana(和诺亚(Noah(的公寓高。这意味着他住在1号建筑物的三楼。罗恩的房间比阿隆多。罗恩住在大风上方的一层。2号建筑物中最高的公寓是5个房间的公寓。

我需要在每个人都住在哪个地板上。

这是代码。

solve([dana,building1,F1,R1],
      [noah,building1,F2,R2],
      [joni,building1,F3,R3],
      [gale,building2,F4,R4],
      [ron, building2,F5,R5],
      [aron,building2,F6,R6]) :-
   assign([1,2,3],[F1,F2,F3]),
   assign([1,2,3],[F4,F5,F6]),
   assign([3,4,5],[R1,R2,R3]),
   assign([3,4,5],[R4,R5,R6]),
   F3 > F2,
   F3 > F1,
   F2 =:= F4,
   R5 =:= R6-1,
   F5 =:= F4+1,
   (  F4 =:= 3, R4 =:= 5
   ;  F5 =:= 3, R5 =:= 5
   ;  F6 =:= 3, R6 =:= 5
   ).
assign(_,[]).
assign(Digs,[D|Vars]):-
   del(D,Digs,Digs1),
   assign(Digs1,Vars).
del(X,L,L1) :-
   remove(X,L,L1).
remove([],X,[]) :- !. 
remove([X|T],X,L1) :- !, remove(T,X,L1).   
remove([H|T],X,[H|L1]) :- remove(T,X,L1).

我不明白在以下解决方案中使用哪个查询?当我尝试从原始帖子中进行查询时,

solve([dana,building1,F1,R1],[noah,building1,F2,R2],[joni,building1,F3,R3],
      [gale,building2,F4,R4],[ron, building2,F5,R5],[aron,building2,F6,R6]).

它说

Type error: `evaluable' expected, found `[]' (an empty_list)
In:
   [2] []>[]
   [1] solve([dana,building1|...],[noah,building1|...],[joni,building1|...],
             [gale,building2|...],[ron, building2|...],[aron,building2|...]) 
at  line 1

正确查询是什么?

谢谢。

对给定代码的查询是正确的。

代码包含错误。

del(X,L,L1) :-
   remove(X,L,L1).   % WRONG

您需要更改呼叫remove/3中的参数顺序,以对应它们在remove/3的定义中的使用。

您可以通过在小中测试来发现它。仅在提示中尝试查询assign([1,2,3],Floors),您就会发现它是否按预期工作

del(D,[1,2,3],Digs1),遵循assign/2定义,

assign([1,2,3],[D|Vars]):-
   del(D,[1,2,3],Digs1),
   ..... .

remove(D,[1,2,3],Digs1),遵循del/3定义,

del(D,[1,2,3],Digs1) :-
   remove(D,[1,2,3],Digs1).

查看定义

  remove([],   X,[]    ) :- !. 
remove([X|T],X,L1    ) :- !, remove(T,X,L1).
remove([H|T],X,[H|L1]) :- remove(T,X,L1).

知道我们对 D 的预期含义是从[1,2,3]中持有一个 digit

(其余的是故意留空的(

相关内容

  • 没有找到相关文章

最新更新