我的legal_time谓词在输入legal_time(X)时应该输出。
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。但它不起作用。有什么想法吗?
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).
目标legal_duration(E-S)
有一个结构(-)/2
作为参数。改用
D is E-S,
legal_duration(D).
但是,请注意,您正在使用的浮点不能完全代表底数 10 或底数 5
尾数。另请注意,如果E-S
是浮点数,但D
是整数,反之亦然,则这可能不起作用。出于这个原因,尽管效率较低,但您可能会说:
legal_duration(D),
D =:= E-S.
这是因为浮点整数是不同类型的,因此不可统一,但算术计算仍然允许正确的转换:
?- 1 = 1.0.
false.
?- 1 =:= 1.0,
true.