list - Prolog,我想从列表中获取 2 个不同的值,并将所有其他值获取到另一个列表中
问题描述
假设我有并且list(A,X,Y,R)
我想得到两个不同的值,并且所有其他值都转到.X
Y
A
A
R
我怎么能这样做?
例子
?- list([],X,Y,R). false.
?- list([1],X,Y,R). false.
?- list([1,2],X,Y,R). X=1, Y=2, R=[];
X=2, Y=1, R=[].
?- list([1,1],X,Y,R). X=1, Y=1, R=[];
X=1, Y=1, R=[].
?- list([1,2,3],X,Y,R). X=1, Y=2, R=[3];
X=1, Y=3, R=[2];
X=2, Y=1, R=[3];
X=2, Y=3, R=[1]; X=3, Y=1, R=[2]; X=3, Y=2, R=[1].
解决方案
好的,这里你有一个通用的解决方案。我已经在 SWI-prolog 中尝试过,但如果任何谓词对你不起作用,至少你可以寻找一个等价的:
list([A,B|T], X, Y, T) :-
permutation([A,B], [X, Y]).
list([A,B|T], X, Y, [D|R]) :-
permutation([C, D], [A,B]),
list([C|T], X, Y, R).
分解:
- 基本情况:
X
andY
是任意顺序的前两个元素。R
将是列表的尾部。 - 递归案例:从前两个元素中,选择一个 (
D
) 并将其从列表中删除,然后再试一次,然后将其添加到R
.
它传递了您给出的示例,尽管解决方案的检索顺序与您编写的顺序不同。
推荐阅读
- sql - 如何进行交易管理
- function - 如何在 Fortran 中定义周期函数?
- python - python argparse 在一个命令行中有多个子解析器
- networking - python influxdb用什么网络协议来发送数据?
- swift - 当 ClassA 发生变化时,如何在 ClassB 上执行函数?
- javascript - 如何为 fullcalendar (v5) 事件设置属性?
- ios - 多个目标匹配链接器标志的隐式依赖关系
- reference - 在 Juris-M 中使用 jm-chinese-gb7714-2005-numeric.csl 重复标题
- php - 使用mysqli将值传递到输入框PHP的函数
- postman - 当返回包含一项的数组时,邮递员测试对数组的测试失败