Prolog整数比较

时间:2014-03-19 15:39:37

标签: prolog logic

您好我在Prolog中有一个简单的时钟,以5分钟的间隔测量时间

nextTime(Hrs:Mins1, Hrs:Mins2) :- nextMins(Mins1, Mins2).
nextTime(Hrs1:'55', Hrs2:'00') :- nextHrs(Hrs1, Hrs2).

nextHrs('12', '13').
nextHrs('13', '14').
nextHrs('14', '15').
nextHrs('15', '16'). // and so on 

nextMins('00', '05').
nextMins('05', '10').
nextMins('10', '15').
nextMins('15', '20'). // and so on 

现在我想写一个谓词,它允许我说时间t2是时间还是时间t1之前,它听起来很简单,但我不知道如何比较谓词中的两个整数。

我尝试过喜欢的东西:

after(H1:M1, H2:M2) :- (H1 < H2).

arithmetic(X,Y) :- (X<Y).
after(H1:M1, H2:M2) :- arithmetic(H1,H2).

我对Prolog来说真的很新,所以对某些人来说可能看起来很傻。 所以我的实际问题是如何比较Prolog中谓词定义中的两个整数。

2 个答案:

答案 0 :(得分:2)

一个有用的Prolog功能&#39; Standard Order of Terms&#39;。然后你可以写

after(T1, T2) :- T1 @< T2.

答案 1 :(得分:1)

您没有整数:您有 atoms atom '9'比较大于原子12

只要你的原子总是2位小数('09'而不是'9'),你可以使用compare/3

after(H1:M1,H2,M2) :- compare( '>' , H1:M1 , H2:M2 ) .

on_or_after(H1:M1,H2:M2) :- compare( '>' , H1:M1 , H2:M2 ) .
on_or_after(H1:M1,H2:M2) :- compare( '=' , H1:M1 , H2:M2 ) .

如果更改谓词以使用整数而不是原子

nextHrs(12, 13).
nextHrs(13, 14).
nextHrs(14, 15).
nextHrs(15, 16). // and so on  

nextMins(00, 05).
nextMins(05, 10).
nextMins(10, 15).
nextMins(15, 20). // and so on 

你可以使用arithmetic comparison operators并简单地写一下:

compare_time( H1:M1 , H2:M2 , '<' ) :- H1 < H2 .
compare_time( H1:M1 , H1,M2 , '<' ) :- M1 < M2 .
compare_time( HH:MM , HH:MM , '=' ) .
compare_time( H1:M1 , H2:M2 , '>' ) :- H1 > H2 .
compare_time( H1:M1 , H1:M2 , '>' ) :- M1 > M2 .

如果你将原子一直保持为2位数的文本值,你仍然可以做同样的事情,但你必须使用the standard order of terms operators而不是算术比较运算符。

compare_time( H1:M1 , H2:M2 , '<' ) :- H1 @< H2 .
compare_time( H1:M1 , H1,M2 , '<' ) :- M1 @< M2 .
compare_time( HH:MM , HH:MM , '=' ) .
compare_time( H1:M1 , H2:M2 , '>' ) :- H1 @> H2 .
compare_time( H1:M1 , H1:M2 , '>' ) :- M1 @> M2 .