Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog比较并有条件地返回true或false_Prolog - Fatal编程技术网

Prolog比较并有条件地返回true或false

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 我提

我不熟悉序言,正在尝试解决一些问题。我有两个列表,例如下面的列表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

我提出了这个想法,但它不起作用,我找不到原因

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)个元素
    在哪里?