【问题标题】:How to implement kind of sumator in prolog如何在 prolog 中实现一种 sumator
【发布时间】:2012-03-12 18:55:31
【问题描述】:

我正在尝试实现谓词,该谓词将在所有变量未替换的模式下工作 sum(X,Y,Z) 将生成满足条件 X+Y=Z 的所有数字。 那么实际上我可以通过这种方式生成下一个数字的列表。

lisst([_]).
lisst([_|Y]) :- lisst(Y).
fill([]).
fill([0|Xs]) :- fill(Xs).
fill([1|Xs]) :- fill(Xs).
fill([2|Xs]) :- fill(Xs).
fill([3|Xs]) :- fill(Xs).
fill([4|Xs]) :- fill(Xs).
fill([5|Xs]) :- fill(Xs).
fill([6|Xs]) :- fill(Xs).
fill([7|Xs]) :- fill(Xs).
fill([8|Xs]) :- fill(Xs).
fill([9|Xs]) :- fill(Xs).



concat_number(D,N) :- concat_number(D,N,0).
concat_number([],M,M).
concat_number([H|T],N,M) :- M1 is M*10+H, concat_number(T,N,M1).

    sum2(X,Y,Z) :-lisst(X),fill(X),lisst(Y),fill(Y),concat_number(X,X1), concat_number(Y,Y1), Z is X1 + Y1.

我对 prolog 的要求是?- sum2(X,Y,Z)。但它不能很好地工作,只有 Y 数在变化。

【问题讨论】:

  • 我无法重现错误(在 SWI-Prolog 上)。顺便说一句,枚举有限列表的惯用方式是length(L,_)
  • 未定义过程:concat_number。此外,X 是该定义中的单例变量。
  • 请编辑您的原始问题; cmets 不适合长代码。另外,请重新考虑您的问题并尝试发送SSCCE

标签: prolog


【解决方案1】:

您遇到的行为是由于 Prolog 的深度优先搜索控制算法:因为Y 具有无限数量的值,所以 Prolog 永远不会回溯到它的选择点之外。你应该实现一个iterative deepening search 算法,比如

length(XY, _),       % backtrack over lists in order of length
X=[_|_],             % constrain X and Y to be non-empty
Y=[_|_],
append(X, Y, XY),    % break XY into X and Y
fill(XY),            % fill X and Y in one go
concat_number(X,I),
concat_number(Y,J),
Z is I+J.

【讨论】:

  • 任何没有附加附加的版本都会产生垃圾
  • hmm 以及如何不生成许多相同的答案,如 [0,4]、[0,0.4] 好的,我在填充结束时删除填充(0|Xs)
  • @user1262568:通过生成列表并将其转换为数字来执行此操作是导致许多重复的原因。你最好直接用int(0). int(N) :- int(M), N is M+1.等谓词生成整数
  • 但是再次存在不更改 X 变量的问题,它将一直是 0
  • @user1262568:如果您调整我发布的算法,则不会。即,您应该只生成一个整数Z,然后将其分解为XY 部分。
猜你喜欢
  • 1970-01-01
  • 2012-05-16
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多