我有一个作业,我正在编写一堆基本的Primitive Recursive函数,其中一个是减法。我没有提供前任的定义,并认为我不太可能将其定义为eval Pred [x] = x-1
。下面是我对PR的定义,我还定义了其他几个函数,如times,AND,OR,NOT,pow,true,false和ite。是否有可能只用我在这里的东西来定义减法?如果是这样,有人可以给我一些指导。我目前的想法是,我可以做一些事情,给定minus[x,y]
递归y
次,然后返回P 2
。如果y > x
我应该返回零。以下是我对PR的定义。
import Prelude hiding (pred,and,or,not)
data PR = Z
| S
| P Int
| C PR [PR]
| PR PR PR
deriving Show
eval :: PR -> [Integer] - Integer
eval Z _ = 0
eval S [x] = x+1
eval (P n) xs = nth n xs
eval (C f gs) xs = eval f (map (\g -> eval g xs) gs)
eval (PR g h) (0:xs) = eval g xs
eval (PR g h) (x:xs) = eval h ((x-1) : eval (PR g h) ((x-1):xs) : xs)
nth _ [] = error "nth nil"
nth 0 _ = error "nth index"
nth 1 (x:_) = x
nth (n) (_:xs) = nth (n-1) xs
one = C S [Z]
plus = PR (P 1) (C S [P 2])
编辑;我发现我的问题在于定义正确的基本情况。 PR (P 3) (P 1)
返回P 1 - 1
,这是向正确方向迈出的一步,但是,我需要递归P 3
次。我在想像PR (PR Z (P 3)) (P 1)
之类的东西会这样做。这当然是不正确的,但想法是从P 3
递归到Z
,每次递减P 1
。
答案 0 :(得分:2)
我意识到这样做的方法是使用PR定义前任。
pred = PR Z (P 1)
如果x-1
,则返回x = 0
或零。
从那里,modus可以定义如下
modus = C modus' [P 2, P 1]
modus' = PR P 1 (C pred [P 2])
递归递减P 1
P 2
次或直到P 1
等于零。