2

基本的な原始再帰関数をたくさん書いている課題があります。そのうちの1つは減算です。私は前任者の定義を提供されていなかったので、それをと定義できる可能性は低いと思いますeval Pred [x] = x-1。以下は私のPRの定義であり、時間、AND、OR、NOT、pow、true、false、iteなどの他のいくつかの関数が定義されています。私がここに持っているものだけで減算を定義することは可能ですか?もしそうなら、誰かが私にいくつかのガイダンスを与えることができます。私の現在の考えは、minus[x,y]再帰y時間を与えてから戻ると、次のようなことができるということですP 2y > 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 - 1P 3PR (PR Z (P 3)) (P 1)P 3ZP 1

4

1 に答える 1

1

これを行う方法は、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、ゼロに等しくなるまでです。

于 2012-11-26T06:51:19.840 に答える