【问题标题】:Prolog - Multiples of a Number Below an Upper LimitProlog - 低于上限的数字的倍数
【发布时间】:2017-07-15 18:48:26
【问题描述】:

我目前正在 Prolog 中制作一个程序,该程序将计算一个数字的所有倍数(包括它自己),不超过另一个数字的值。我正在使用以下查询进行测试:

    ?- multiples(4,12,R,0)

此查询将列出所有小于或等于 12 的 4 的倍数,例如。 4, 8, 12. R 将返回结果,而 0 是我打算实现的计数器,该计数器将为每次乘法计数,例如。 4*1,4*2,4*3。我被卡住了,我不确定简单地添加倍数并检查它是否低于上限或者是否可以使用计数器或累加器来完成是否是一个更好的设计。

multiples(N,U,R,Ctr) :-
        N =< U,
        R is Ctr * N,
        R =< U,
        increment(Ctr,Ctr2),
        multiples(N,U,R,Ctr2).

increment(Num, Num1) :-
        Num1 is Num+1.

我相信我的程序在从自身内部调用倍数的递归步骤中失败了。我知道递归需要一个基本情况才能退出,但我完全被困在这里,希望能有一些方向。

【问题讨论】:

  • N =&lt; U不用勾选,我认为Ctrl应该以1开头。
  • 此外,R永远统一。这将始终导致false

标签: prolog


【解决方案1】:

CLP(FD) 在这里非常有用:

:- use_module(library(clpfd)).

multiple(Multiplicand, Max, Multiple) :-
    MaxMultiplier #= Max // Multiplicand,
    label([MaxMultiplier]),
    Multiplier in 1 .. MaxMultiplier,
    Multiple #= Multiplier * Multiplicand,
    label([Multiple]).

?- multiple(4, 12, M).
M = 4 ;
M = 8 ;
M = 12.

?-

在这种情况下使用 CLP(FD),您还可以将第一个参数作为变量进行查询:

|?- multiple(N, 12, 8).
N = 8 ;
N = 4 ;
N = 2 ;
N = 1.

或乘数和结果:

?- multiple(N, 4, M).
N = M, M = 3 ;
N = M, M = 4 ;
N = M, M = 2 ;
N = 2,
M = 4 ;
N = M, M = 1 ;
N = 1,
M = 2 ;
N = 1,
M = 3 ;
N = 1,
M = 4.

?-

如果你想将它们收集到一个列表中,你可以使用findall/3

?- findall(Multiple, multiple(4, 12, Multiple), Multiples).
Multiples = [4, 8, 12].

?-

【讨论】:

    【解决方案2】:

    您的方法的问题是 没有基本情况:确实,您的算法将始终产生false. 它会将RN 统一起来,然后进行递归,递归将尝试将R2*N 统一,这将失败。

    一个想法可能是使用一个累加器您每次都将增量添加到该累加器。比如:

    multiples(N,U,R) :-
        multiples(N,N,U,R).
    
    multiples(_,C,U,C) :-
        C =< U.
    multiples(N,C,U,R) :-
        C =< U,
        C1 is C+N,
        multiples(N,C1,U,R).
    

    所以在这里我们调用multiples(3,12,R).,它会导致:

    ?- multiples(4,12,R).
    R = 4 ;
    R = 8 ;
    R = 12 ;
    false.
    

    【讨论】:

      猜你喜欢
      • 2021-05-09
      • 2021-04-13
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多