【问题标题】:Prolog comparing and returning true or false conditionallyProlog有条件地比较和返回真或假
【发布时间】:2021-05-21 21:26:00
【问题描述】:

我是序言的新手,正在尝试解决一些问题。我在下面分别有两个列表,例如 List1 和 List2:

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 谓词有什么问题,我被卡住了。非常感谢您的帮助!

【问题讨论】:

  • 从问题描述中不清楚示例是否正确。在您的示例中,the (n+1)th element of the List2 在哪里?

标签: prolog


【解决方案1】:
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).
  1. 模式匹配不必只是[Head|Tail]形式,你可以使用[A, B]来匹配两个元素列表。
  2. 你可以把A -> B; fail写成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 ).,即使对于此特定代码不是 必需。 .
猜你喜欢
  • 2014-12-15
  • 1970-01-01
  • 2014-09-07
  • 2015-03-14
  • 1970-01-01
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多