我的任务是编写一个Prolog程序,该程序将给定的多米诺骨牌块放入循环中。我想我会先把它们排序,然后检查最后一个数字和第一个数字匹配的答案。但是,负责后一个任务的谓词(domino_order2)给我带来了一些麻烦。对我如何实现最后一次检查有什么想法吗?提前谢谢你!
domino_order2(L1, L2):-
end_match(L2,L2),
domino_order(L1, L2).
end_match([X-Y | _],L2):-
%last(L2,X).
append(_,[Y-X],L2).
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).
预期结果:
?- domino_order2([4-3,3-5,5-8,8-4],Out).
Out = [4-3, 3-5, 5-8, 8-4] ;
Out = [3-4, 4-8, 8-5, 5-3] ;
Out = [3-5, 5-8, 8-4, 4-3] ;
Out = [5-3, 3-4, 4-8, 8-5] ;
Out = [5-8, 8-4, 4-3, 3-5] ;
Out = [8-5, 5-3, 3-4, 4-8] ;
Out = [8-4, 4-3, 3-5, 5-8] ;
Out = [4-8, 8-5, 5-3, 3-4].
?- domino_order2([4-3,3-5,5-8,8-5],Out).
false.
发布于 2021-12-14 22:21:58
下面是一个重写,它与所需的输出(但不是输出的确切顺序)匹配:
domino_order(Lst, Ord) :-
(Lst1 = Lst ; reverse_dominos(Lst, Lst1)),
domino_order_left_to_right(Lst1, Ord).
reverse_dominos(Lst, RevLst) :-
reverse_dominos_(Lst, [], RevLst).
reverse_dominos_([], RevLst, RevLst).
reverse_dominos_([X-Y|Tail], SoFar, RevLst) :-
% Reverse the numbers and their position
reverse_dominos_(Tail, [Y-X|SoFar], RevLst).
domino_order_left_to_right(Lst, Lst1) :-
% Get a starting point in Lst
append([Before, [Start], After], Lst),
% Rearrange the list
append([[Start], After, Before], Lst1).
结果在swi-prolog:
?- time(findall(Ord, domino_order([4-3,3-5,5-8,8-4], Ord), Ords)).
% 244 inferences, 0.000 CPU in 0.000 seconds (97% CPU, 1475890 Lips)
Ords = [[4-3,3-5,5-8,8-4],[3-5,5-8,8-4,4-3],[5-8,8-4,4-3,3-5],[8-4,4-3,3-5,5-8],[4-8,8-5,5-3,3-4],[8-5,5-3,3-4,4-8],[5-3,3-4,4-8,8-5],[3-4,4-8,8-5,5-3]].
https://stackoverflow.com/questions/70353119
复制相似问题