list - 在Prolog中根据需要列出列表的元素
问题描述
这是我在 Prolog 中的列表:
myList([a,b,c,d,e]).
我正在尝试写一个谓词。该谓词应该给我这个结果:
ab
ac
ad
ae
bc
bd
be
cd
ce
de
我找到了一个接近我目标的解决方案。但这并不是我想要的。
?- L=[a,b,c], findall(foo(X,Y), (member(X,L),member(Y,L)), R).
L = [a, b, c],
R = [foo(a, a), foo(a, b), foo(a, c), foo(b, a), foo(b, b), foo(b, c), foo(c, a), foo(c, b), foo(..., ...)].
例如,我不想 aa 或 bb 或 cc。此外,已经有 ac 结果。所以我不想再去。
对不起我的英语不好。谢谢。
解决方案
?- set_prolog_flag(double_quotes, chars).
true.
?- List = "abcde",
bagof(X-Y, Pre^Ys^( append(Pre, [X|Ys], List), member(Y,Ys) ), XYs).
List = "abcde",
XYs = [a-b,a-c,a-d,a-e,b-c,b-d,b-e,c-d,c-e,d-e].
?- List = [A,B,C,D,E],
bagof(X-Y, Pre^Ys^( append(Pre, [X|Ys], List), member(Y,Ys) ), XYs).
List = [A,B,C,D,E],
XYs = [A-B,A-C,A-D,A-E,B-C,B-D,B-E,C-D,C-E,D-E].
从您的问题来看,您想要的并不是那么明显,但您似乎很乐意使用findall/3
. 以上解决方案使用bagof/3
的是findall/3
. bagof/3
考虑到变量,因此您可以使用具体字符[a,b,c,d,e]
或变量列表获得相同的结果[A,B,C,D,E]
。
您使用了术语foo(a,b)
,在这种情况下更常见(也更方便)说a-b
。
推荐阅读
- javascript - 为什么我的代码行为不一致?没有随机化或任何东西
- r - rlang::sym 似乎不适用于该对象
- html - html报告中的Powershell输出颜色
- oracle - Oracle - 将交货分配到新行程并发货确认
- json - 如何在swift中将参数传递给post API
- python - 在 Matplotlib imshow 中为特定值设置颜色
- php - 修改查询字符串的 .htaccess
- facebook-graph-api - 如何从不是我的页面中检索 facebook 数据
- linux - 通过中间(跳转)主机将文件复制到远程主机
- java - 从列表列表中以功能方式创建列表的最简洁方法?