在其数字中拆分数字,以所有可能的方式分组

Split Number in its digits, grouped in all possble ways

我有一个数字,假设是 123,我想生成一组所有可能的拆分方式:

[[1, 23], [12, 3], [1, 2, 3]].

?- findall(Powerset, powerset([1,2,3], Powerset), Z).

Z = [[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]].

[[1], [2, 3]] -> [1, 23]

[[1, 2], [3]] -> [12, 3]

[[1], [2], [3]] -> [1, 2, 3]
powerset(L, [H|T]):-

 append([H|T], _, L).

powerset([_|L], P):-

 powerset(L, P).
parts(C, [C]).

parts(L, Ps) :-

  append(H, T, L), H \\= [], T \\= [],

  parts(T, Ts),

  append([H], Ts, Ps).

?- number_codes(123,Cs),parts(Cs,Ps),maplist(number_codes,Ns,Ps).

Cs = [49, 50, 51],

Ps = [[49, 50, 51]],

Ns = [123] ;

...etc...

?- findall(Ns,(number_codes(123,Cs),parts(Cs,Ps),maplist(number_codes,Ns,Ps)),Rs).

Rs = [[123], [1, 23], [1, 2, 3], [12, 3]].
int_split(X) -->

 int_split__aux(X,10,[]).



int_split__aux(X,P,Ds) -->

 ( { X =:= 0 }

 -> [Ds]

 ; { X < P }

 -> [[X|Ds]]

 ; { X0 is X mod P,

    X1 is X div P },

   int_split__aux(X1,10,[X0|Ds]),

   { P1 is P*10 },

   int_split__aux(X,P1,Ds)

 ).

?- phrase(int_split(123),Zss).

Zss = [[1,2,3], [12,3], [1,23], [123]].



?- phrase(int_split(1234),Zss).

Zss = [[1,2,3,4], [12,3,4], [1,23,4], [123,4], [1,2,34], [12,34], [1,234], [1234]].

我想过创建 [1,2,3] 的幂集:

[[1, 23], [12, 3], [1, 2, 3]].

?- findall(Powerset, powerset([1,2,3], Powerset), Z).

Z = [[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]].

[[1], [2, 3]] -> [1, 23]

[[1, 2], [3]] -> [12, 3]

[[1], [2], [3]] -> [1, 2, 3]
powerset(L, [H|T]):-

 append([H|T], _, L).

powerset([_|L], P):-

 powerset(L, P).
parts(C, [C]).

parts(L, Ps) :-

  append(H, T, L), H \\= [], T \\= [],

  parts(T, Ts),

  append([H], Ts, Ps).

?- number_codes(123,Cs),parts(Cs,Ps),maplist(number_codes,Ns,Ps).

Cs = [49, 50, 51],

Ps = [[49, 50, 51]],

Ns = [123] ;

...etc...

?- findall(Ns,(number_codes(123,Cs),parts(Cs,Ps),maplist(number_codes,Ns,Ps)),Rs).

Rs = [[123], [1, 23], [1, 2, 3], [12, 3]].
int_split(X) -->

 int_split__aux(X,10,[]).



int_split__aux(X,P,Ds) -->

 ( { X =:= 0 }

 -> [Ds]

 ; { X < P }

 -> [[X|Ds]]

 ; { X0 is X mod P,

    X1 is X div P },

   int_split__aux(X1,10,[X0|Ds]),

   { P1 is P*10 },

   int_split__aux(X,P1,Ds)

 ).

?- phrase(int_split(123),Zss).

Zss = [[1,2,3], [12,3], [1,23], [123]].



?- phrase(int_split(1234),Zss).

Zss = [[1,2,3,4], [12,3,4], [1,23,4], [123,4], [1,2,34], [12,34], [1,234], [1234]].

然后将集合组合在一起并用append/3检查它们的连接是否是初始集合[1,2,3],即

[[1, 23], [12, 3], [1, 2, 3]].

?- findall(Powerset, powerset([1,2,3], Powerset), Z).

Z = [[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]].

[[1], [2, 3]] -> [1, 23]

[[1, 2], [3]] -> [12, 3]

[[1], [2], [3]] -> [1, 2, 3]
powerset(L, [H|T]):-

 append([H|T], _, L).

powerset([_|L], P):-

 powerset(L, P).
parts(C, [C]).

parts(L, Ps) :-

  append(H, T, L), H \\= [], T \\= [],

  parts(T, Ts),

  append([H], Ts, Ps).

?- number_codes(123,Cs),parts(Cs,Ps),maplist(number_codes,Ns,Ps).

Cs = [49, 50, 51],

Ps = [[49, 50, 51]],

Ns = [123] ;

...etc...

?- findall(Ns,(number_codes(123,Cs),parts(Cs,Ps),maplist(number_codes,Ns,Ps)),Rs).

Rs = [[123], [1, 23], [1, 2, 3], [12, 3]].
int_split(X) -->

 int_split__aux(X,10,[]).



int_split__aux(X,P,Ds) -->

 ( { X =:= 0 }

 -> [Ds]

 ; { X < P }

 -> [[X|Ds]]

 ; { X0 is X mod P,

    X1 is X div P },

   int_split__aux(X1,10,[X0|Ds]),

   { P1 is P*10 },

   int_split__aux(X,P1,Ds)

 ).

?- phrase(int_split(123),Zss).

Zss = [[1,2,3], [12,3], [1,23], [123]].



?- phrase(int_split(1234),Zss).

Zss = [[1,2,3,4], [12,3,4], [1,23,4], [123,4], [1,2,34], [12,34], [1,234], [1234]].

您是否想到了另一种更简单(更优雅)的解决方案?

我使用来自 gnu Prolog powerset 修改的这个谓词

[[1, 23], [12, 3], [1, 2, 3]].

?- findall(Powerset, powerset([1,2,3], Powerset), Z).

Z = [[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]].

[[1], [2, 3]] -> [1, 23]

[[1, 2], [3]] -> [12, 3]

[[1], [2], [3]] -> [1, 2, 3]
powerset(L, [H|T]):-

 append([H|T], _, L).

powerset([_|L], P):-

 powerset(L, P).
parts(C, [C]).

parts(L, Ps) :-

  append(H, T, L), H \\= [], T \\= [],

  parts(T, Ts),

  append([H], Ts, Ps).

?- number_codes(123,Cs),parts(Cs,Ps),maplist(number_codes,Ns,Ps).

Cs = [49, 50, 51],

Ps = [[49, 50, 51]],

Ns = [123] ;

...etc...

?- findall(Ns,(number_codes(123,Cs),parts(Cs,Ps),maplist(number_codes,Ns,Ps)),Rs).

Rs = [[123], [1, 23], [1, 2, 3], [12, 3]].
int_split(X) -->

 int_split__aux(X,10,[]).



int_split__aux(X,P,Ds) -->

 ( { X =:= 0 }

 -> [Ds]

 ; { X < P }

 -> [[X|Ds]]

 ; { X0 is X mod P,

    X1 is X div P },

   int_split__aux(X1,10,[X0|Ds]),

   { P1 is P*10 },

   int_split__aux(X,P1,Ds)

 ).

?- phrase(int_split(123),Zss).

Zss = [[1,2,3], [12,3], [1,23], [123]].



?- phrase(int_split(1234),Zss).

Zss = [[1,2,3,4], [12,3,4], [1,23,4], [123,4], [1,2,34], [12,34], [1,234], [1234]].

我们可以有一个更集中的谓词来代替 powerset

[[1, 23], [12, 3], [1, 2, 3]].

?- findall(Powerset, powerset([1,2,3], Powerset), Z).

Z = [[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]].

[[1], [2, 3]] -> [1, 23]

[[1, 2], [3]] -> [12, 3]

[[1], [2], [3]] -> [1, 2, 3]
powerset(L, [H|T]):-

 append([H|T], _, L).

powerset([_|L], P):-

 powerset(L, P).
parts(C, [C]).

parts(L, Ps) :-

  append(H, T, L), H \\= [], T \\= [],

  parts(T, Ts),

  append([H], Ts, Ps).

?- number_codes(123,Cs),parts(Cs,Ps),maplist(number_codes,Ns,Ps).

Cs = [49, 50, 51],

Ps = [[49, 50, 51]],

Ns = [123] ;

...etc...

?- findall(Ns,(number_codes(123,Cs),parts(Cs,Ps),maplist(number_codes,Ns,Ps)),Rs).

Rs = [[123], [1, 23], [1, 2, 3], [12, 3]].
int_split(X) -->

 int_split__aux(X,10,[]).



int_split__aux(X,P,Ds) -->

 ( { X =:= 0 }

 -> [Ds]

 ; { X < P }

 -> [[X|Ds]]

 ; { X0 is X mod P,

    X1 is X div P },

   int_split__aux(X1,10,[X0|Ds]),

   { P1 is P*10 },

   int_split__aux(X,P1,Ds)

 ).

?- phrase(int_split(123),Zss).

Zss = [[1,2,3], [12,3], [1,23], [123]].



?- phrase(int_split(1234),Zss).

Zss = [[1,2,3,4], [12,3,4], [1,23,4], [123,4], [1,2,34], [12,34], [1,234], [1234]].

现在

[[1, 23], [12, 3], [1, 2, 3]].

?- findall(Powerset, powerset([1,2,3], Powerset), Z).

Z = [[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]].

[[1], [2, 3]] -> [1, 23]

[[1, 2], [3]] -> [12, 3]

[[1], [2], [3]] -> [1, 2, 3]
powerset(L, [H|T]):-

 append([H|T], _, L).

powerset([_|L], P):-

 powerset(L, P).
parts(C, [C]).

parts(L, Ps) :-

  append(H, T, L), H \\= [], T \\= [],

  parts(T, Ts),

  append([H], Ts, Ps).

?- number_codes(123,Cs),parts(Cs,Ps),maplist(number_codes,Ns,Ps).

Cs = [49, 50, 51],

Ps = [[49, 50, 51]],

Ns = [123] ;

...etc...

?- findall(Ns,(number_codes(123,Cs),parts(Cs,Ps),maplist(number_codes,Ns,Ps)),Rs).

Rs = [[123], [1, 23], [1, 2, 3], [12, 3]].
int_split(X) -->

 int_split__aux(X,10,[]).



int_split__aux(X,P,Ds) -->

 ( { X =:= 0 }

 -> [Ds]

 ; { X < P }

 -> [[X|Ds]]

 ; { X0 is X mod P,

    X1 is X div P },

   int_split__aux(X1,10,[X0|Ds]),

   { P1 is P*10 },

   int_split__aux(X,P1,Ds)

 ).

?- phrase(int_split(123),Zss).

Zss = [[1,2,3], [12,3], [1,23], [123]].



?- phrase(int_split(1234),Zss).

Zss = [[1,2,3,4], [12,3,4], [1,23,4], [123,4], [1,2,34], [12,34], [1,234], [1234]].

所以我们可以用 findall

收集有趣的 Ns

[[1, 23], [12, 3], [1, 2, 3]].

?- findall(Powerset, powerset([1,2,3], Powerset), Z).

Z = [[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]].

[[1], [2, 3]] -> [1, 23]

[[1, 2], [3]] -> [12, 3]

[[1], [2], [3]] -> [1, 2, 3]
powerset(L, [H|T]):-

 append([H|T], _, L).

powerset([_|L], P):-

 powerset(L, P).
parts(C, [C]).

parts(L, Ps) :-

  append(H, T, L), H \\= [], T \\= [],

  parts(T, Ts),

  append([H], Ts, Ps).

?- number_codes(123,Cs),parts(Cs,Ps),maplist(number_codes,Ns,Ps).

Cs = [49, 50, 51],

Ps = [[49, 50, 51]],

Ns = [123] ;

...etc...

?- findall(Ns,(number_codes(123,Cs),parts(Cs,Ps),maplist(number_codes,Ns,Ps)),Rs).

Rs = [[123], [1, 23], [1, 2, 3], [12, 3]].
int_split(X) -->

 int_split__aux(X,10,[]).



int_split__aux(X,P,Ds) -->

 ( { X =:= 0 }

 -> [Ds]

 ; { X < P }

 -> [[X|Ds]]

 ; { X0 is X mod P,

    X1 is X div P },

   int_split__aux(X1,10,[X0|Ds]),

   { P1 is P*10 },

   int_split__aux(X,P1,Ds)

 ).

?- phrase(int_split(123),Zss).

Zss = [[1,2,3], [12,3], [1,23], [123]].



?- phrase(int_split(1234),Zss).

Zss = [[1,2,3,4], [12,3,4], [1,23,4], [123,4], [1,2,34], [12,34], [1,234], [1234]].

这里不需要使用findall/3---使用dcg!

[[1, 23], [12, 3], [1, 2, 3]].

?- findall(Powerset, powerset([1,2,3], Powerset), Z).

Z = [[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]].

[[1], [2, 3]] -> [1, 23]

[[1, 2], [3]] -> [12, 3]

[[1], [2], [3]] -> [1, 2, 3]
powerset(L, [H|T]):-

 append([H|T], _, L).

powerset([_|L], P):-

 powerset(L, P).
parts(C, [C]).

parts(L, Ps) :-

  append(H, T, L), H \\= [], T \\= [],

  parts(T, Ts),

  append([H], Ts, Ps).

?- number_codes(123,Cs),parts(Cs,Ps),maplist(number_codes,Ns,Ps).

Cs = [49, 50, 51],

Ps = [[49, 50, 51]],

Ns = [123] ;

...etc...

?- findall(Ns,(number_codes(123,Cs),parts(Cs,Ps),maplist(number_codes,Ns,Ps)),Rs).

Rs = [[123], [1, 23], [1, 2, 3], [12, 3]].
int_split(X) -->

 int_split__aux(X,10,[]).



int_split__aux(X,P,Ds) -->

 ( { X =:= 0 }

 -> [Ds]

 ; { X < P }

 -> [[X|Ds]]

 ; { X0 is X mod P,

    X1 is X div P },

   int_split__aux(X1,10,[X0|Ds]),

   { P1 is P*10 },

   int_split__aux(X,P1,Ds)

 ).

?- phrase(int_split(123),Zss).

Zss = [[1,2,3], [12,3], [1,23], [123]].



?- phrase(int_split(1234),Zss).

Zss = [[1,2,3,4], [12,3,4], [1,23,4], [123,4], [1,2,34], [12,34], [1,234], [1234]].

示例使用:

[[1, 23], [12, 3], [1, 2, 3]].

?- findall(Powerset, powerset([1,2,3], Powerset), Z).

Z = [[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]].

[[1], [2, 3]] -> [1, 23]

[[1, 2], [3]] -> [12, 3]

[[1], [2], [3]] -> [1, 2, 3]
powerset(L, [H|T]):-

 append([H|T], _, L).

powerset([_|L], P):-

 powerset(L, P).
parts(C, [C]).

parts(L, Ps) :-

  append(H, T, L), H \\= [], T \\= [],

  parts(T, Ts),

  append([H], Ts, Ps).

?- number_codes(123,Cs),parts(Cs,Ps),maplist(number_codes,Ns,Ps).

Cs = [49, 50, 51],

Ps = [[49, 50, 51]],

Ns = [123] ;

...etc...

?- findall(Ns,(number_codes(123,Cs),parts(Cs,Ps),maplist(number_codes,Ns,Ps)),Rs).

Rs = [[123], [1, 23], [1, 2, 3], [12, 3]].
int_split(X) -->

 int_split__aux(X,10,[]).



int_split__aux(X,P,Ds) -->

 ( { X =:= 0 }

 -> [Ds]

 ; { X < P }

 -> [[X|Ds]]

 ; { X0 is X mod P,

    X1 is X div P },

   int_split__aux(X1,10,[X0|Ds]),

   { P1 is P*10 },

   int_split__aux(X,P1,Ds)

 ).

?- phrase(int_split(123),Zss).

Zss = [[1,2,3], [12,3], [1,23], [123]].



?- phrase(int_split(1234),Zss).

Zss = [[1,2,3,4], [12,3,4], [1,23,4], [123,4], [1,2,34], [12,34], [1,234], [1234]].

相关推荐

  • Spring部署设置openshift

    Springdeploymentsettingsopenshift我有一个问题让我抓狂了三天。我根据OpenShift帐户上的教程部署了spring-eap6-quickstart代码。我已配置调试选项,并且已将Eclipse工作区与OpehShift服务器同步-服务器上的一切工作正常,但在Eclipse中出现无法消除的错误。我有这个错误:cvc-complex-type.2.4.a:Invali…
    2025-04-161
  • 检查Java中正则表达式中模式的第n次出现

    CheckfornthoccurrenceofpatterninregularexpressioninJava本问题已经有最佳答案,请猛点这里访问。我想使用Java正则表达式检查输入字符串中特定模式的第n次出现。你能建议怎么做吗?这应该可以工作:MatchResultfindNthOccurance(intn,Patternp,CharSequencesrc){Matcherm=p.matcher…
    2025-04-161
  • 如何让 JTable 停留在已编辑的单元格上

    HowtohaveJTablestayingontheeditedcell如果有人编辑JTable的单元格内容并按Enter,则内容会被修改并且表格选择会移动到下一行。是否可以禁止JTable在单元格编辑后转到下一行?原因是我的程序使用ListSelectionListener在单元格选择上同步了其他一些小部件,并且我不想在编辑当前单元格后选择下一行。Enter的默认绑定是名为selectNext…
    2025-04-161
  • Weblogic 12c 部署

    Weblogic12cdeploy我正在尝试将我的应用程序从Tomcat迁移到Weblogic12.2.1.3.0。我能够毫无错误地部署应用程序,但我遇到了与持久性提供程序相关的运行时错误。这是堆栈跟踪:javax.validation.ValidationException:CalltoTraversableResolver.isReachable()threwanexceptionatorg.…
    2025-04-161
  • Resteasy Content-Type 默认值

    ResteasyContent-Typedefaults我正在使用Resteasy编写一个可以返回JSON和XML的应用程序,但可以选择默认为XML。这是我的方法:@GET@Path("/content")@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})publicStringcontentListRequestXm…
    2025-04-161
  • 代码不会停止运行,在 Java 中

    thecodedoesn'tstoprunning,inJava我正在用Java解决项目Euler中的问题10,即"Thesumoftheprimesbelow10is2+3+5+7=17.Findthesumofalltheprimesbelowtwomillion."我的代码是packageprojecteuler_1;importjava.math.BigInteger;importjava…
    2025-04-161
  • Out of memory java heap space

    Outofmemoryjavaheapspace我正在尝试将大量文件从服务器发送到多个客户端。当我尝试发送大小为700mb的文件时,它显示了"OutOfMemoryjavaheapspace"错误。我正在使用Netbeans7.1.2版本。我还在属性中尝试了VMoption。但仍然发生同样的错误。我认为阅读整个文件存在一些问题。下面的代码最多可用于300mb。请给我一些建议。提前致谢publicc…
    2025-04-161
  • Log4j 记录到共享日志文件

    Log4jLoggingtoaSharedLogFile有没有办法将log4j日志记录事件写入也被其他应用程序写入的日志文件。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化?Log4j有一个SocketAppender,它将向服务发送事件,您可以自己实现或使用与Log4j捆绑的简单实现。它还支持syslogd和Windows事件日志,这对于尝试将日志输出与来自非Java应用程序…
    2025-04-161