将列表1中的特定数字与列表2中的特定数字进行交换

Vol*_*014 3 predicate list prolog

我最近一直在刷一些Prolog.我有点喜欢提出随机问题来尝试解决然后解决它们.这一点非常艰难,我不会放弃我已经着手解决的问题.

问题:我想创建一个谓词,它将有2个预定列表,2个数字要交换,然后在交换完成后输出列表.

进一步说明:我希望从列表1中找到一个特定的唯一编号,并使用列表2中的特定唯一编号交换它,以便如果我有2个列表... [7,2,7] ,8,5]和[1,2,3,8,7,9,8],然后给出谓词2个数字(只说8和7),那么数字8和数字7将被交换如果数字8在第一个列表中而数字7在第二个列表中,则在列表IF和ON之间.(它将忽略第二个列表中的8和第一个列表中的7).

具有预期答案的示例查询:

?- bothSwap([7,2,7,8,5],[1,2,3,8,7,9,8],8,7,X,Y).
X = [7,2,7,7,5], Y = [1,2,3,8,8,9,8].
Run Code Online (Sandbox Code Playgroud)

我有点陷入困境:

bothSwap([],L2,N1,N2,[],L2).
bothSwap(L1,[],N1,N2,L1,[]).
bothSwap([H1|T1],[H2|T2],N1,N2,X,Y) :- H1 == N1, H2 == N2, bothSwap(T1,T2,N1,N2,D1,D2), append(D1,[H2],X), append(D2,[H1],Y).
bothSwap([H1|T1],[H2|T2],N1,N2,X,Y) :- H1 == N1, H2 =\= N2, bothSwap([H1|T1],T2,N1,N2,D1,D2).
bothSwap([H1|T1],[H2|T2],N1,N2,X,Y) :- H1 =\= N1, H2 == N2, bothSwap(T1,[H2|T2],N1,N2,D1,D2).
Run Code Online (Sandbox Code Playgroud)

有什么聪明的头脑愿意和我一起解决这个问题吗?:)

Dan*_*ons 5

想象一下,如果我们可以"希望"在所需元素出现时拆分列表,这个问题会变得多么简单,如下所示:

?- splitsies([1,2,3,4,5,6,7,8], 4, Prefix, Suffix).
Prefix = [1, 2, 3],
Suffix = [5, 6, 7, 8] ;
Run Code Online (Sandbox Code Playgroud)

你猜怎么着?:) append/3可以做到这一点:

% splitsies is true if X splits list into a prefix/suffix pair.
splitsies(List, X, Start, Finish) :-
    append(Start, [X|Finish], List).
Run Code Online (Sandbox Code Playgroud)

现在问题看起来很简单!

bothSwap(Left, Right, A, B, AfterLeft, AfterRight) :-
    % break up the inputs
    splitsies(Left,  A, LPre, LPost),
    splitsies(Right, B, RPre, RPost),

    % glue together the outputs (note that A and B are switched)
    splitsies(AfterLeft,  B, LPre, LPost),
    splitsies(AfterRight, A, RPre, RPost).
Run Code Online (Sandbox Code Playgroud)

我不会假装这个解决方案是有效的...但它太热了你最好在你输入时佩戴烤箱手套.哦,并检查出来:

?- bothSwap([7,2,7,8,5],[1,2,3,8,7,9,8], X, Y, [7,2,7,7,5], [1,2,3,8,8,9,8]).
X = 8,
Y = 7 ;
false.
Run Code Online (Sandbox Code Playgroud)