如何在Prolog中将“或”与数学函数一起使用?

时间:2019-12-03 19:37:30

标签: prolog

我是Prolog的新手,我目前正在Prolog中构建KenKen解算器,但是我对如何使用它有些困惑。

在KenKen中,有些“笼子”中的数字必须等于(加||子||多|| div)以等于所需的笼子总数。例如,一个笼子必须将两个数字(X,Y)相除等于2。但是,X和Y可以是(X / Y)或(Y / X);顺序无关紧要。

我正在尝试弄清楚如何使Prolog能够将两种可能性都检查为“或”。

这是我尝试过的代码:

Cage2 is (X/Y), Cage2 =:= 2,
Cage2 is (Y/X), Cage2 =:= 2,

并尝试:

Cage2 is (X/Y), (Y/X), Cage2 =:= 2,

但是此代码现在仅读取第一个,而我无法读取第二个。

1 个答案:

答案 0 :(得分:0)

因此,您的第一个块无法成功,因为 Even: Odd: Divisible by 5: 10 3 10 20 7 20 22 13 30 24 21 -234455 26 29 0 30 344208 2056 仅在Cage2两次都相同时才能成功。您正在尝试在此处重新分配Cage2 is (X/Y), ... Cage2 is (Y/X),而Prolog根本无法采用这种方式。另外,Prolog中的逗号表示“和”,因此您已经说过所有这四个概念必须是正确的,查询才是正确的,并且没有一对数字(X,Y)使得X / Y和Y / X = 2。

您的第二个块无法成功,因为Cage2只是在闲逛而无所事事,事实证明这是语法错误。

您需要的是运算符(Y/X),这就是您在Prolog中写“或”的方式。要在单个子句中执行此操作,您需要类似以下内容:

;

如果您有两个子句,它将更加容易:

(X/Y =:= 2; Y/X =:= 2).

在第二种情况下,您将从具有两个子句的内容中获取隐式“或”。这将为您生成一个选择点,您可能不希望这样做,但实际上并不是那么有害。