我是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,
但是此代码现在仅读取第一个,而我无法读取第二个。
答案 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).
在第二种情况下,您将从具有两个子句的内容中获取隐式“或”。这将为您生成一个选择点,您可能不希望这样做,但实际上并不是那么有害。