私はアルゴリズムを書き、それをPrologに実装しようとしましたが、括弧が期待どおりに機能しないことがわかりました。括弧を終了する前に、書き込まれた内容がすべて完了しているわけではありません。コードは次のとおりです。
%1. If the first member of L1 is smaller than L2
% A. If the first member of L1 is not equal to Last
% Than: A.1 Add the first member of L1 to the first member of NL
% Begin recurssion on the resumption of L1, L2 resumption of NL
% and Last from L1.
% Else: A.2 begin the recursion on resumption of L1, L2 with the
% first member and L3 with the first member.
% 2. If the first member in L1 is equal to the first member of L2,
% Than: Start recursion on resumption of L1 and L2 (with its first
% member) and Last = *.
% 3. If the first member of L1 is bigger than the first membber of L2
% Than: begin recursion on L1 with the first member, resumption of
% L2 and Last = x. %(x != * only for debugging)
%
*/
make_list([X1|L1], [X2|L2], [X3|NewL], Last) :-
(
X1 < X2,
(
X1 \= Last, %A
X3=X1;
make_list(L1, [X2|L2], NewL, X1) %B
), %Why those parenthesis do not work as expected?
! %green cut
);
(
X1=X2,
make_list(L1, [X2|L2], [X3|NewL], *)
),
!
;
make_list([X1|L1], L2, [X3|NewL], *).
B
私の質問は、それを期待どおりに機能させる方法と、一度実行すると機能しないのはなぜA
ですか?結局のところ、それも同じ括弧内にあります。例:
?- make_list([6,6,10,20],[10,25,30],L, -).
L = [6|_G849] % (should be [6,20]).
EDIT1:make_listは、にL1
含まれていないすべてのメンバーを検索L2
してNewLに配置し、解析されLast
た最後のメンバーを格納する必要がありL1
ます。
EDIT2:いいえ->は許可されています(これはhowmeworkです)。誰かが私にそれ以外の場合はプロローグで表現する方法を教えてくれるなら、それは素晴らしいことかもしれません。