如何在Prolog中找到一个数字中的最大数字?

时间:2016-06-12 20:46:00

标签: prolog

我有一个简单的任务,但不知怎的,我在一个多小时内没有解决它。我正在做的这个递归不起作用,我陷入了一个infinte循环。它应该将数字的最后一位数与其他数字进行比较,并记住最大数字。我真的很想知道为什么我的逻辑错误以及如何解决这个问题。

这是我的尝试:

maxDigit(X,X):-
   X<10.
maxDigit(X,N):-
   X1 is X//10,
   X2 is X mod 10,
   maxDigit(X1,N1),
   X2=<N1,
   N is  N1.
maxDigit(X,N):-
   X1 is X//10,
   X2 is X mod 10,
   maxDigit(X1,N1),
   X2>N1,
   N is X2.

4 个答案:

答案 0 :(得分:2)

使用SICStus Prolog 4.3.3,我们只需将n_base_digits/3maximum/2合并为:

?- n_base_digits(12390238464, 10, _Digits), maximum(Max, _Digits).
Max = 9.

答案 1 :(得分:2)

评论建议在遇到最大数字时立即停止。这就是我们的方式:

:- use_module(library(clpfd)).    
:- use_module(library(reif)).

#=(X, Y, T) :- X #= Y #<==> B, bool10_t(B, T).

bool10_t(1, true).
bool10_t(0,false).

根据if_/3(;)/3(#=)/3,我们定义:

n_base_maxdigit(N, Base, D) :-
   N    #>  0,                               % positive integers only
   Base #>  1,                               % smallest base = 2
   D    #>= 0,
   D    #<  Base,
   n_base_maxdigit0_maxdigit(N, Base, 0, D).

n_base_maxdigit0_maxdigit(N, Base, D0, D) :-
   D1 #= N mod Base,
   N0 #= N //  Base,
   D2 #= max(D0,D1),
   if_(( D2 + 1 #= Base ; N0 #= 0 ),
       D = D2,
       n_base_maxdigit0_maxdigit(N0, Base, D2, D)).

使用带有Prolog 的SWI-Prolog 7.3.22进行的示例查询:

?- use_module(library(lambda)).
true.

?- Max+\ ( N is 7^7^7 * 10+9, time(n_base_maxdigit(N,10,Max)) ).
% 663 inferences, 0.001 CPU in 0.001 seconds (100% CPU, 1022162 Lips)
Max = 9.

答案 2 :(得分:1)

您只需使用if / then / else:

maxDigit(X,X):-
   X<10,
   !. % added after false's remark

maxDigit(X,N):-
   X1 is X//10,
   X2 is X mod 10,
   maxDigit(X1,N1),
   (   X2<N1
   ->  N =  N1
   ;   N = X2).

答案 3 :(得分:0)

SWI-Prolog中的

可能是:

FrameLayout frame = (FrameLayout) findViewById(R.id.frame);
ImageView image1 = ...
ImageView image2 = ...


FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        layoutParams.gravity = Gravity.RIGHT | Gravity.TOP;
i.setLayoutParams(layoutParams); 
frame.addView(image1);
frame.addView(image2);