我目前正试图解决一个简单的"乘以peano整数" Prolog中的问题。
我知道Prolog默认提供基本的算术逻辑,但我试图用peano整数实现基本的算术逻辑。
由于乘法基本上是重复加法,我认为它看起来像这样:
%Addition
% Adds two peano integers 3+2: add(s(s(s(0))),s(s(0)),X). --> X = s(s(s(s(s(0)))))
add(X,0,X).
add(X,s(Y),s(Z)) :- add(X,Y,Z).
%Loop
%Loop by N
loop(0).
loop(N) :- N>0, NewN is N-1, loop(NewN).
问题是我没有想法如何根据系数运行循环N次,添加peano整数并建立正确的结果。我确信这很容易实现,并且生成的代码可能不会比几行代码更长。我现在已经试图实现这个好几个小时了,它开始让我发疯。
非常感谢你的帮助,并且......圣诞快乐!
麦克
答案 0 :(得分:1)
感谢@false提示此帖子: Prolog successor notation yields incomplete result and infinite loop
本文中引用的PDF文档有助于阐明有关peano整数的许多功能以及如何使简单算术工作 - 第11页和第12页特别有用:http://ssdi.di.fct.unl.pt/flcp/foundations/0910/files/class_02.pdf
代码可以像这样设置 - 请注意乘以整数的两种方法:
%Basic assumptions
int(0). %0 is an integer
int(s(M)) :- int(M). %the successor of an integer is an integer
%Addition
sum(0,M,M). %the sum of an integer M and 0 is M.
sum(s(N),M,s(K)) :- sum(N,M,K). %The sum of the successor of N and M is the successor of the sum of N and M.
%Product
%Will work for prod(s(s(0)),s(s(0)),X) but not terminate for prod(X,Y,s(s(0)))
prod(0,M,0). %The product of 0 with any integer is 0
prod(s(N),M,P) :-
prod(N,M,K),
sum(K,M,P).%The product of the successor of N and M is the sum of M with the product of M and N. --> (N+1)*M = N*M + M
%Product #2
%Will work in both forward and backward direction, note the order of the calls for sum() and prod2()
prod2(0,_,0). %The product of 0 with any given integer is 0
prod2(s(N), M, P) :- % implements (N+1)*M = M + N*M
sum(M, K, P),
prod2(M,N,K).
在咨询数据库时会给你这样的东西:
?- prod(s(s(s(0))),s(s(s(0))),Result).
Result = s(s(s(s(s(s(s(s(s(0))))))))).
?- prod2(s(s(s(0))),s(s(s(0))),Result).
Result = s(s(s(s(s(s(s(s(s(0))))))))).
请注意prod()
和prod2()
在反向咨询Prolog时的不同行为 - 在跟踪时,请注意Prolog在递归调用期间绑定其变量的方式:
?- prod(F1,F2,s(s(s(s(0))))).
F1 = s(0),
F2 = s(s(s(s(0)))) ;
F1 = F2, F2 = s(s(0)) ;
ERROR: Out of global stack
?- prod2(F1,F2,s(s(s(s(0))))).
F1 = s(s(s(s(0)))),
F2 = s(0) ;
F1 = F2, F2 = s(s(0)) ;
F1 = s(0),
F2 = s(s(s(s(0)))) ;
false.
因此,我不鼓励使用prod()
,因为它无法在所有可行的场景中可靠地终止,而是使用prod2()
。
我对StackOverflow的人们感到非常兴奋。我得到了很多有用的反馈,这真的帮助我更深入地了解了Prolog的工作原理。非常感谢大家!
麦克
编辑:由于@false和以下帖子,我再看一下这个问题:Prolog successor notation yields incomplete result and infinite loop