谓词用于返回prolog中给定列表的元素顺序的排列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谓词用于返回prolog中给定列表的元素顺序的排列相关的知识,希望对你有一定的参考价值。

我正在试图弄清楚Prolog中的这个谓词是如何产生排列的,但我无法弄清楚sel的第二个谓词 - 并且想知道其他人是否清楚这一点?

% permutation(L1, L2): L2 is a permutation of L1                   

permutation([], []).
permutation(L1, [X|Y]):-
   sel(L1, X, T),
   permutation(T, Y).

sel([X|Y], X, Y).
sel([X|Y], Z, [X|T]):-
   sel(Y, Z, T).
答案

sel/3只是找到列表拆分头和列表其余部分的排列。如果你打电话给你,你得到:

?- sel([1,2,3],A,B).
A = 1,
B = [2, 3]

A = 2,
B = [1, 3]

A = 3,
B = [1, 2]
false

请注意,在prolog中,谓词是按顺序测试的,所以如果你运行它

sel([X|Y], X, Y).
sel([X|Y], Z, [X|T]):-
    sel(Y, Z, T).

solve(L,LO):-
    findall([A,B],sel(L,A,B),LO).

你得到

L = [[1, [2, 3]], [2, [1, 3]], [3, [1, 2]]]

但是如果你像这样交换两个谓词

sel([X|Y], Z, [X|T]):-
    sel(Y, Z, T).
sel([X|Y], X, Y).

solve(L,LO):-
    findall([A,B],sel(L,A,B),LO).

你得到

L = [[3, [1, 2]], [2, [1, 3]], [1, [2, 3]]]

这显然会改变结果。

以上是关于谓词用于返回prolog中给定列表的元素顺序的排列的主要内容,如果未能解决你的问题,请参考以下文章

Prolog 中的子列表谓词

Prolog - 如何返回每个元素只出现一次的列表?

同时应用谓词来过滤列表(SWI Prolog)

在 Prolog 中使用约束和排列解决难题

使用迭代器按谓词重新排列

如何通过Prolog将字符串连接到列表中的多个元素?