gpt4 book ai didi

prolog - 根据索引交换两个项目

转载 作者:行者123 更新时间:2023-12-04 01:11:28 25 4
gpt4 key购买 nike

我有一个这样的谓词:

swap(List, Index1, Index2, New_List).
List = [3,8,1,6].
Index1 = 1.
Index2 = 3.

通过交换,New_List 将是:

New_List = [3,6,1,8].

我正在尝试实现一些代码,但我不明白为什么它会给我:False。

你能帮我理解为什么我的代码是错误的,我该如何修正它?

代码:

swap([],_,_,[]).

swap(List, Index1, Index2, New_List) :-
swap(List, 0, Index1, Index2, New_List),
print(New_List).

swap([],_,_,_,[]).
swap(List, Index, Index1, Index2, [H|R]) :-
Index \== Index1,
nth0(Index, List, H, _Rest),
Index_New is Index+1,
swap(List, Index_New, Index1, Index2, R).

swap(List, Index, Index1, Index2, [H|R]) :-
Index == Index1,
nth0(Index2, List, H, _Rest),
Index_New is Index+1,
swap(List, Index_New, Index1, Index2, R).

swap(List, Index, Index1, Index2, [H|R]) :-
Index == Index2,
nth0(Index1, List, H, _Rest),
Index_New is Index+1,
swap(List, Index_New, Index1, Index2, R).

谢谢。

最佳答案

您可以使用跟踪来准确查看发生了什么。像这样:

?- trace.
true.

[trace] ?- swap([3,8,1,6], 1, 3, R).
Call: (10) swap([3, 8, 1, 6], 1, 3, _13242) ? /* Press 'h' */ Options:
+: spy -: no spy
/c|e|r|f|u|a goal: find .: repeat find
a: abort A: alternatives
b: break c (ret, space): creep
[depth] d: depth e: exit
f: fail [ndepth] g: goals (backtrace)
h (?): help i: ignore
l: leap L: listing
n: no debug p: print
r: retry s: skip
u: up w: write
m: exception details
C: toggle show context
Call: (10) swap([3, 8, 1, 6], 1, 3, _13242) ? creep
Call: (11) swap([3, 8, 1, 6], 0, 1, 3, _13242) ? creep
Call: (12) 0\==1 ? creep
Exit: (12) 0\==1 ? creep
Call: (12) lists:nth0(0, [3, 8, 1, 6], _13830, _13990) ? creep

您可以使用“c”“悄悄”完成谓词的其余评估,并尝试了解它与您预期发生的情况有何不同。

例如,如果您已经选择使用 nth0/4,我不明白为什么您需要额外的参数、0 等等。我正在使用 the nth0/4 that I find in SWI-Prolog .


这应该足够了:

swap(L, A, B, Result) :-
nth0(B, L, Y, L0),
nth0(A, L0, X, L1),
A < B,
nth0(A, L2, Y, L1),
nth0(B, Result, X, L2).

索引之间的顺序很重要。如果您不想重新计算索引,交换的顺序也很重要。您甚至可以枚举这两个索引:

?- swap([a,b,c], A, B, R).
A = 0,
B = 1,
R = [b, a, c] ;
A = 0,
B = 2,
R = [c, b, a] ;
A = 1,
B = 2,
R = [a, c, b] ;
false.

对于这个查询,这仍然没有终止:

?- swap(List, A, B, Swapped).

要完全正确,这将是一件非常棘手的事情。它需要在这种模式下工作吗?编辑:参见 the answer by Isabelle Newbie .

关于prolog - 根据索引交换两个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64726526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com