首页 > 解决方案 > 在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 结果。所以我不想再去。

对不起我的英语不好。谢谢。

标签: listprolog

解决方案


?- 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


推荐阅读