Prolog整数比较

Prolog整数比较,prolog,logic,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 ne

大家好,我在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).
在(H1:M1,H2:M2)之后:-(H1


算术(X,Y):-(X一个有用的Prolog功能,它是“”。然后您可以编写

after(T1, T2) :- T1 @< T2.
(T1,T2)之后的
:-T1@
一个有用的序言功能,它是“”。然后您可以编写

after(T1, T2) :- T1 @< T2.
(T1,T2)之后的
:-T1@
一个有用的序言功能,它是“”。然后您可以编写

after(T1, T2) :- T1 @< T2.
(T1,T2)之后的
:-T1@
一个有用的序言功能,它是“”。然后您可以编写

after(T1, T2) :- T1 @< T2.
(T1,T2)之后的
:-T1@
你没有任何整数:你有原子。原子
'9'
比原子
12

只要原子始终是2位小数(
'09'
而不是
'9'
),就可以使用
比较/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 
您可以使用并简单地编写如下内容:

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 .
比较时间(H1:M1,H2:M2,'):-M1>M2。
如果将原子始终保持为2位文本值,仍然可以执行相同的操作,但必须使用算术比较运算符,而不是算术比较运算符

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 .
比较时间(H1:M1,H2:M2,'):-M1@>M2。
你没有任何整数:你有原子。原子
'9'
比原子
12

只要原子始终是2位小数(
'09'
而不是
'9'
),就可以使用
比较/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 
您可以使用并简单地编写如下内容:

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 .
比较时间(H1:M1,H2:M2,'):-M1>M2。 如果将原子始终保持为2位文本值,仍然可以执行相同的操作,但必须使用算术比较运算符,而不是算术比较运算符

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 .
比较时间(H1:M1,H2:M2,'):-M1@>M2。
你没有任何整数:你有原子。原子
'9'
比原子
12

只要原子始终是2位小数(
'09'
而不是
'9'
),就可以使用
比较/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 
您可以使用并简单地编写如下内容:

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 .
比较时间(H1:M1,H2:M2,'):-M1>M2。 如果将原子始终保持为2位文本值,仍然可以执行相同的操作,但必须使用算术比较运算符,而不是算术比较运算符

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 .
比较时间(H1:M1,H2:M2,'):-M1@>M2。
你没有任何整数:你有原子。原子
'9'
比原子
12

只要原子始终是2位小数(
'09'
而不是
'9'
),就可以使用
比较/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 
您可以使用并简单地编写如下内容:

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 .
比较时间(H1:M1,H2:M2,'):-M1>M2。 如果将原子始终保持为2位文本值,仍然可以执行相同的操作,但必须使用算术比较运算符,而不是算术比较运算符

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 .
比较时间(H1:M1,H2:M2,'):-M1@>M2。
如果您使用的是
@Nicholas,作为我声明的补充,OP可以在小时和分钟内使用字符串,然后使用
T1@
,只要小时和分钟始终保持零填充到两位数(我确信这是他们的意图)。比较,
'03':'25'<'13':'20'
将“做正确的事情”。如果您使用
@Nicholas,作为我声明的补充,OP可以使用字符串持续数小时和数分钟,然后使用
T1@
,只要小时和数分钟始终保持零填充到两位数(我确信这是他们的意图)。比较,
'03':'25'@<'13':'20'
将“做正确的事情”。如果您使用
@Nicholas,作为我声明的补充,OP可以使用字符串持续数小时和数分钟,然后使用
T1@
,只要小时和数分钟始终保持零填充到两位数(我确信这是他们的意图)。比较,
'03':'25'@<'13':'20'
将“做正确的事情”。如果您使用
@Nicholas,作为我声明的补充,OP可以使用字符串持续数小时和数分钟,然后使用
T1@
,只要小时和数分钟始终保持零填充到两位数(我确信这是他们的意图)。比较,
'03':'25'@<'13':'20'
将“做正确的事情”。您使用字符串而不仅仅是数字是有原因的吗?如果您使用整数,@capelical显示的解决方案将按需要工作。您使用字符串而不仅仅是数字是有原因的吗?如果您使用整数,@capelical显示的解决方案将按需要工作。您使用字符串f是有原因的吗或者数字而不仅仅是数字?如果您使用整数,@capelical显示的解决方案将按需要工作。您使用字符串而不仅仅是数字有什么原因吗?如果您使用整数,@capelical显示的解决方案将按需要工作。只要时间
HH:MM
where
HH
MM
是整数而不是字符串。所以
3:30@
是假的,但
3:30@<13:40.
是真的。@mbrach:也许OP已经意识到了这个问题,因为他发布了带前导零的原子…是的