基本的な原始再帰関数をたくさん書いている課題があります。そのうちの1つは減算です。私は前任者の定義を提供されていなかったので、それをと定義できる可能性は低いと思いますeval Pred [x] = x-1
。以下は私のPRの定義であり、時間、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