首页 > 解决方案 > 分支中的单例变量

问题描述

我正在用 Prolog 解决代码出现问题的第二天的第二部分。他们要求我进行某种验证,措辞如下:

每个策略实际上描述了密码中的两个位置,其中 1 表示第一个字符,2 表示第二个字符,依此类推。(小心;Toboggan 公司政策没有“索引零”的概念!)其中一个位置必须包含给定的字母。其他出现的信件与政策执行的目的无关。

给定上面相同的示例列表:

  • 1-3 a: abcde有效:位置 1 包含a,位置 3 不包含。
  • 1-3 b: cdefg无效:位置 1 和位置 3 都不包含b.
  • 2-9 c: ccccccccc无效:位置 2 和位置 9 都包含c.

为了验证这一点,我编写了以下代码:

valid_case([CAI, CBI, Char, Password]):-
  nth1(CAI, Password, CA),
  nth1(CBI, Password, CB),
  (
    CA == Char,
    CB \== Char
  );(
    CA \== Char,
    CB == Char
  ).

但是,我收到以下警告:

Warning: /home/pkoch/github.com/pkoch/aoc-2020/2/2.pl:31:
Warning:    Singleton variable in branch: CA
Warning:    Singleton variable in branch: CB
Warning:    Test is always true: CA\==Char
Warning:    Test is always false: CB==Char

显然,Prolog 注意到了一些我没有注意到的东西。我试过环顾四周,但每个人都指出“你没有使用变量”,但我在两个分支中都使用它们。有人可以指出我正确的方向以了解我做错了什么吗?

标签: prolog

解决方案


这就是我打算写的:

valid_case([CAI, CBI, Char, Password]):-
  nth1(CAI, Password, CA),
  nth1(CBI, Password, CB),
  ((
    CA == Char,
    CB \== Char
  );(
    CA \== Char,
    CB == Char
  )).

推荐阅读