【问题标题】:Calculating Time Difference in Prolog在 Prolog 中计算时差
【发布时间】:2012-05-07 17:52:05
【问题描述】:

我在 Prolog 中编写一个相对简单的谓词时遇到了一些麻烦。这个谓词应该接收格式为 Hours:Minutes 的两个参数,计算两者之间的差异并检查该值是否大于或等于 40 分钟。

这是我目前所拥有的:

time(Time1, Time2):- 
    X:Y =:= Time1, A:B =:= Time2, calculate_time(X, Y, A, B).

calculate_time(X, Y, A, B):-
    Y - X =:= 0,
    B - A >= 40, !.
calculate_time(X, Y, A, B):-
    Y - X > 0.

你可以想象,这给出了一个错误,即:

?- time(10:00, 10:55).
 ERROR at  clause 1 of user:time/2 !!
 INSTANTIATION ERROR- in arithmetic: expected bound value

所以,据我所知,他认为他得到了四个论据。他为什么会有这样的反应?另外,在文件的开头,我有以下命令:

:-op(500,xfy,:).
:-op(600,xfy,/).

这个谓词应该是更大程序的一部分,所以这两行需要保留在文件中。我没有使用任何模块,我正在使用 YAP。

任何帮助将不胜感激!

【问题讨论】:

    标签: prolog operators predicate


    【解决方案1】:

    你有两个问题。 第一个是您使用 =:=/2 测试两个数值表达式的计算结果是否相同,但您使用的是结构而不是数值表达式。

    您的逻辑似乎也不完全正确(最后一个子句没有意义,您是从第一次的小时数中减去分钟数)

    【讨论】:

    【解决方案2】:

    如果时差大于或等于 40 分钟,则返回 true。

    程序:

    time(A:B,X:Y):- 
        HOURS is X - A,
        MINUTES is Y - B,
        LENGTH is HOURS*60 + MINUTES,
        LENGTH >= 40.
    

    测试1:

    ?- time(06:40,09:45).
    true.
    

    测试2:

    ?- time2(09:40,09:45).
    false.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 2017-08-24
      相关资源
      最近更新 更多