序言中的逆置换

时间:2017-02-19 20:02:26

标签: prolog permutation

我不明白为什么我的代码不起作用。

An inverse permutation is a permutation in which each number and the number of the place which it occupies are exchanged. For example [3,8,5,10,9,4,6,1,7,2] -> [8,10,1,6,3,7,9,2,5,4]

inv_perm3(X,[F],length(X)):-
    length([F]) == 1,
    !,
    nth0(F,X,length(X)).
inv_perm3(X,[F|M],N):-
    nth0(F,X,N),            %nth0(?Index, List, Elem)
    F is F+1,
    N1 is N+1,
    inv_perm3(X,M,N1).

inv_perm(A,B):-
    inv_perm3(A,B,1).

我在每个输入中都是假的,我测试它是这样的:inv_perm([2,3,1],X)。

1 个答案:

答案 0 :(得分:1)

它的方式更简单......一个提示

?- X=[3,8,5,10,9,4,6,1,7,2],same_length(Y,X),nth1(I,X,V),nth1(V,Y,I).
X = [3, 8, 5, 10, 9, 4, 6, 1, 7|...],
Y = [_358, _364, 1, _376, _382, _388, _394, _400, _406|...],
I = 1,
V = 3 ;
X = [3, 8, 5, 10, 9, 4, 6, 1, 7|...],
Y = [_358, _364, _370, _376, _382, _388, _394, 2, _406|...],
I = 2,
V = 8 ;
...

虽然我只显示了两个列表中的1个元素,但您应该使用forall / 2来检查所有元素,或者使用findall / 3来关联两个列表。 Findall将允许生成逆,而forall只会检查正确性