list - 将列表 1 中的特定数字与列表 2 中的特定数字交换

标签 list prolog predicate

我最近一直在复习一些 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 在第二个列表中。 (它会忽略第二个列表中的 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].

我有点卡在这一点上:
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).

有没有聪明人愿意和我一起解决这个问题? :)

最佳答案

想象一下,如果我们可以“希望”在出现所需元素时拆分列表,那么这个问题将是多么容易,如下所示:

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

你猜怎么着? :) append/3可以这样做:
% splitsies is true if X splits list into a prefix/suffix pair.
splitsies(List, X, Start, Finish) :-
    append(Start, [X|Finish], List).

现在问题看起来很简单!
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).

我不会假装这个解决方案是有效的……但它太热了,你输入时最好戴上 toastr 手套。哦,看看这个:
?- 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.

关于list - 将列表 1 中的特定数字与列表 2 中的特定数字交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30929796/

相关文章:

c# - 将 DataGridView 绑定(bind)到可能包含零个元素的 IBindingList

Prolog:代码生成

prolog - 如何在 Prolog 中实现 SKI 组合子?

macros - LISP 中宏的谓词是什么

c++ - _Pass_fn : where is the constructor?

python - 如何提取字符串列表的一部分?

python - Python 中列表的平均值

python - 如何在列表理解中将变量名称提取为字符串?

prolog - 如何从 6 个数字中创建所有可能的 4 位数代码并且不使用重复项?

java - 接受多个谓词作为方法的参数