首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Prolog: legal_time(介于(S,E)之间)没有显示解决方案

Prolog: legal_time(介于(S,E)之间)没有显示解决方案
EN

Stack Overflow用户
提问于 2014-12-09 21:18:29
回答 1查看 23关注 0票数 2

当输入legal_time(X)时,我的legal_time谓词应该输出。

代码语言:javascript
运行
复制
 X = between(11, 12) ;
 X = between(11, 12.5) ;
 X = between(14, 15) ;
 X = between(14, 15.5) ;
 X = between(15, 16) ;
 X = between(15, 16.5) ;
false .

但它说的是假的和退出的。不让我再打任何东西。下面是给我们的谓词,我所要做的就是编写legal_time。但这不管用。有什么想法吗?

代码语言:javascript
运行
复制
is_member(X, [X|_]).
is_member(X, [_|L]) :- is_member(X, L).

/* legal duration */
legal_duration(1).
legal_duration(1.5).

/* legal start time of a class */
start_time_list([11, 12, 14, 15]).

/* legal end time of a class */
end_time_list( [12, 12.5, 14, 14.5, 15, 15.5, 16, 16.5]).

/* 
 *  implement a legal_time(between(S, E)) predicate to generate legal combinations
 *  of S and E such that 
 *  1. S is from the list of the legal start time 
 *  2. E is from the list of the legal end time
 *  3. S-E is a legal duration
 */
 legal_time(between(S,E)) :-
    start_time_list(SL),
    end_time_list(EL),
    is_member(S, SL), 
    is_member(E, EL), 
    legal_duration(E-S).
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-09 21:25:42

目标legal_duration(E-S)有一个结构(-)/2作为参数。代用

代码语言:javascript
运行
复制
   D is E-S,
   legal_duration(D).

但是,请注意,您使用的浮点数不能准确表示基数10或基数5尾数。

还请注意,如果E-S是浮点数,则这可能不起作用,但D是整数,反之亦然。因此,尽管效率较低,但你可能会说:

代码语言:javascript
运行
复制
   legal_duration(D),
   D =:= E-S.

这是因为浮动整数是不同类型的,因此不能统一,但是算术计算仍然允许正确的转换:

代码语言:javascript
运行
复制
?- 1 = 1.0.
   false.
?- 1 =:= 1.0,
   true.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27389010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档