Recursion 理解prolog中的简单递归

Recursion 理解prolog中的简单递归,recursion,prolog,Recursion,Prolog,我从精通Prolog一书中得到了以下Prolog,我正在尝试学习一些简单的递归 mins_to_hours(In, H, M):- In<60, H = 0, M is In. mins_to_hours(In, H, M):- In>=60, In1 is In-60, H1 is H+1, mins_to_hours(In1, H1, M). 分钟到小时(英寸、小时、米):- In=60, In1是In-60, H1是H+

我从精通Prolog一书中得到了以下Prolog,我正在尝试学习一些简单的递归

mins_to_hours(In, H, M):-
    In<60,
    H = 0,
    M is In.
mins_to_hours(In, H, M):-
    In>=60,
    In1 is In-60,
    H1 is H+1,
    mins_to_hours(In1, H1, M).
分钟到小时(英寸、小时、米):-
In=60,
In1是In-60,
H1是H+1,
分钟到小时(1,H1,M)。

我不完全确定它为什么不起作用,我已经摆弄它好几个小时了。非常感谢任何能为我指明正确方向的帮助。提前感谢。

在本例中,您面临的一个主要困难是低级算术谓词的所谓的模式性。例如,让我们用您发布的代码尝试最一般的查询:

?- mins_to_hours(In, H, M). ERROR: Arguments are not sufficiently instantiated 现在,让我们再次尝试最一般的查询,其中所有参数都是新变量:

这看起来还不错

?- mins_to_hours(60, H, M). H = -1, M = 0 ; false. 然后我们得到:

?- mins_to_hours(60, H, M). H = 1, M = 0 ; false. ?分钟到小时(60,小时,米)。 H=1, M=0; 错。 还有两种情况:

?- mins_to_hours(500, H, M). H = 8, M = 20 ; false. ?- mins_to_hours(1000, H, M). H = 16, M = 40 ; false. ?分钟到小时(500,小时,米)。 H=8, M=20; 错。 ?分钟到小时(1000,小时,米)。 H=16, M=40; 错。 看起来很不错


请注意,如果您坚持使用较低级别的算术,您就无法轻松地纠正错误:使用
(忘了提到它应该做什么…它应该将分钟转换为小时和分钟,例如,如果给它140,它应该返回H=2 M=20。你可以编辑你的问题以更新它。你应该将评论中的信息放入问题中。
?- mins_to_hours(60, H, M).
H = -1,
M = 0 ;
false.
mins_to_hours(In, H, M):-
    In #>= 60,
    In1 #= In-60,
    H #= H1+1,
    mins_to_hours(In1, H1, M).
?- mins_to_hours(60, H, M).
H = 1,
M = 0 ;
false.
?- mins_to_hours(500, H, M).
H = 8,
M = 20 ;
false.

?- mins_to_hours(1000, H, M).
H = 16,
M = 40 ;
false.