Prolog比较并有条件地返回true或false
我不熟悉序言,正在尝试解决一些问题。我有两个列表,例如下面的列表1和列表2:Prolog比较并有条件地返回true或false,prolog,Prolog,我不熟悉序言,正在尝试解决一些问题。我有两个列表,例如下面的列表1和列表2: List1: [[0.1, 0.6], [0.1, 0.5], [0.3, 0.5]] List2: [0.2, 0.7, 0.4] 我需要检查List2的第n个元素是否在List1中对应的(第n个)数字对的范围内。如果List2中的数字在范围内,则检查List2的第(n+1)个元素是否满足相同的条件。如果一个数字不满足条件,那么我需要返回false。如果List2中的所有数字都满足条件,那么我需要返回true 我提
List1: [[0.1, 0.6], [0.1, 0.5], [0.3, 0.5]]
List2: [0.2, 0.7, 0.4]
我需要检查List2
的第n个元素是否在List1
中对应的(第n个)数字对的范围内。如果List2
中的数字在范围内,则检查List2
的第(n+1)个元素是否满足相同的条件。如果一个数字不满足条件,那么我需要返回false。如果List2
中的所有数字都满足条件,那么我需要返回true
我提出了这个想法,但它不起作用,我找不到原因
bet(L, R, B) :-
Factor1 is B-L,
Factor2 is R-B,
Factor1 > 0,
Factor2 > 0.
comp_lims([], []).
comp_lims([H1|T1], [H2|T2]) :-
member([Left|T], H1),
member(Right, T),
bet(Left, Right, H2) -> comp_lims(T1, T2); fail.
bet
实际上是我为浮点数编写的比较谓词,在进行如下测试时效果良好:
?- bet(0.3, 0.7, 0.4).
true.
?- bet(0.3, 0.7, 0.8).
false.
但是我找不到comp_lims
谓词有什么问题,我被卡住了。非常感谢您的帮助
comp_lims([], []).
comp_lims([H1|T1], [H2|T2]) :-
H1 = [Left, Right],
( bet(Left, Right, H2) -> comp_lims(T1, T2); fail ).
更好的版本:
comp_lims([], []).
comp_lims([ [Left, Right] | T1], [H2|T2]) :-
bet(Left, Right, H2), comp_lims(T1, T2).
[Head | Tail]
形式,您可以使用[A,B]
来匹配两个元素列表A->B;失败
,就像是A,B
(也有一个隐式切割,但您现在可以忽略它)bet/3
中,您可以执行以下操作:
bet(L, R, B) :-
B-L > 0,
R-B > 0.
隐式地计算两边,因此不需要使用单独的is
。最好突出显示if/then/else运算符的范围:comp_lims([H1 | T1],[H2 | T2]):-H1=[Left,Right],(bet(Left,Right,H2)->comp lims(T1,T2);fail.
,即使对于这个特定的代码来说没有必要……从问题描述中也不清楚示例是否正确。在您的示例中,列表2的第(n+1)个元素在哪里?