我正在序言中制作一个游戏,使用一组给定的多米诺骨牌碎片,它应该使用初始组中的所有碎片制作正确的多米诺骨牌行。我们必须使用一个推理系统,在该系统中我们必须构建初始状态和最终状态,如下所示:
initial(dominos([[1,4],[2,3],[4,2]],[])).
final(dominos([],[[1,4],[4,2],[2,3]])).
Run Code Online (Sandbox Code Playgroud)
第一个转换只是从第一个列表中选择一个块并将其放入第二个列表中,但接下来的转换应该验证第二个数字是否与要放入的块的第一个数字匹配。我想我有第二次转变的头脑
第一次转换:
transition(dominos(L,[]),A,dominos(L1,[A])):- select(A,L,L1).
Run Code Online (Sandbox Code Playgroud)
第二次转变:
transition(dominos(L,B),A,dominos(L1,[[X,Y]|[Y,_])):- select(B,L,L1).
Run Code Online (Sandbox Code Playgroud)
我如何验证条件?
考虑这样的事情:
% L1 is a list of domino pieces (of the form X-Y)
% L2 is L1 in domino order
domino_order(L1, L2) :-
domino_order(L1, _, L2).
domino_order([], _, []) :- !.
domino_order(In, X, [X-Y | Out]) :-
select(Piece, In, Remaining),
swap_or_not(Piece, X-Y),
domino_order(Remaining, Y, Out).
swap_or_not(X-Y, X-Y).
swap_or_not(X-Y, Y-X).
Run Code Online (Sandbox Code Playgroud)
用法:
?- domino_order([5-4, 1-2, 4-3, 2-3], Out).
Out = [5-4, 4-3, 3-2, 2-1] ;
Out = [1-2, 2-3, 3-4, 4-5] ;
false.
Run Code Online (Sandbox Code Playgroud)