是否可以在Prolog中更改初始化变量?

时间:2013-11-23 13:27:44

标签: prolog

我正在做练习来计算数字中的偶数位数。这是该计划。

count_even(Number, 1) :-
  Number < 10,
  even(Number).

count_even(Number, 0) :-
  Number < 10,
  odd(Number).

count_even(Number, Count) :-
  Number >= 10,
  split_number(Number, Digit, NewNumber),
  count_even(NewNumber, NumCount),
  DigCount is mod(Digit + 1, 2),
  Count is NumCount + DigCount.

split_number(Number, Digit, NewNumber) :-
  Digit is mod(Number, 10),
  NewNumber is Number//10.

even(Number) :-
  0 is mod(Number, 2).

odd(Number) :-
  1 is mod(Number, 2).

现在我想知道是否真的有必要在第三个count_even中拥有一个NumCount。如果我将第三个count_even的代码更改为

,该怎么办?
count_even(Number, Count) :-
  Number >= 10,
  split_number(Number, Digit, NewNumber),
  count_even(NewNumber, Count),
  DigCount is mod(Digit + 1, 2),
  Count is Count + DigCount.

现在程序将不再完成其工作,因为如果Count is Count + DigCount等于1,DigCount将失败。我的问题是这样的事情是否可行。是否可以强制Count is Count + DigCount像C#或Java语言一样执行?也就是说,只是进行计算,并且在实例化Count时不会将其视为规则?

1 个答案:

答案 0 :(得分:1)

简短的回答是否定的。由于Prolog变量可以统一或不统一,并且可以很容易地假设它严格意味着统一是实例化并且导致相信通过再次统一或不考虑它可以再次set变量的值{{1}}逻辑公式中的逻辑变量,证明是真的(如你的情况)。

确实有一些技巧,比如Will Ness说,以某些元谓词的形式让你操纵语言计算(因为prolog是homoiconic language)但是它们不是ISO,它们是依赖于实现,最重要的是它们就像在这种情况下射击苍蝇的大炮。

也许其他人会对如何尝试将逻辑结构解释为实现命令式语言结果的方法提出更好的建议,我将指出您将Horn逻辑子句解释为命令式过程by Kowalski。< / p>