2011-12-25 10 views
6

私はprimtive recursive機能を使用してHaskellの中モジュラス機能を作成しようとしています。私はHaskellの弾性プリミティブ再帰

(それがウィキペディア上の例の関数のリスト上にあるので)それが可能だ知っていると私は、論理的にもそれを行うだろう方法を知っている...しかし、私はちょうどそれを実装することはできません!

IEは、ロジックは、私は(再びないハスケル)

function mod(a, b){ 
    if(a < b) return a; 
    return mod(a - b, b); 
} 

しかし、私はちょうど実装することができないよう、再帰を使用して定義することができます(ないprimtive再帰またはハスケル)

function mod(a, b){ 
    while(a > b) 
    a -= b 
    return a; 
} 

ですそれは基本的な再帰関数を使用しています。誰もがすることができれば、私は、私は本当に私は、このような(再びないハスケル)のように定義されたロジックのいくつかの並べ替えを必要とする私の問題を解決するために考えて< B

のロジックである私が行うことはできません

reduce(a, b) 
    = a >= b -> a-b 
    otherwise x 

ビット(A/B - 私は(、B)=すなわちモッズ、潜在的に分割するのを利用した弾性率の関数を定義すると考えるのおかげ

編集:: 、それを本当に感謝します。この任意の部分で私を助けて除算のための私の原始再帰関数は、モジュロに依存しているので)* Bが、私は

笑それを行うことはできません0
+0

'MOD AB | a

+0

@DanBurtonユーザーはすでにこれを前に投稿していましたが、プリミティブな再帰関数のコンテキストに実際には関係ないので、彼のメッセージを削除しました – AlanFoster

答えて

0

これに対する解決策は、

mod(0, y) 
     = zero(y) 
mod(x, 0) 
     = zero(x) 
mod(x + 1, y) 
     = mult3(succ(mod(x, y)), sign(y), notsign(eq(mod(x, y), diff(y, 1)))) 
次のとおりです。次のページでも、私は原始再帰のやや明確な博覧会と思われるものがある http://wiki.portal.chalmers.se/agda/pmwiki.php?n=ReferenceManual.Totality#Primitiverecursion

:原始再帰のこの概念の引用のためのagdaのwikiを参照してください。

1

いくつかのポインタについてこれを見てください:http://www.proofwiki.org/wiki/Quotient_and_Remainder_are_Primitive_Recursive

また、ウィキペディアの定義はいくぶん狭いことに注意してください。それは、これがウィキペディアに与えられたツールに変換することを示すために、少し時間がかかるものの、単一の有限のデータ構造上の誘導によって構築する関数は、原始再帰的です。また、古典的なピーノスタイルでナチュラルを表現することができます。もちろんこれを行う必要はありませんが、誘導についての推論はもっと自然なものになります。 http://plato.stanford.edu/entries/recursive-functions/#1.3

+0

ありがとう、私はそれを実装するために最善を尽くしましたが、 'ビット。リンクは、 ":(REM(N、M)+1)SGN(M)notsgn(χeq(REM(n、m)は、M-˙1))(N + 1、M)= REMだから我々はそれを参照してください" と言いますしかし、(rem(n、m)+ 1)とsgn(m)とnotsgn()を結ぶものは何ですか?それらを一緒に接続する機能はありませんか?あるいは、私はこのhehを誤解している – AlanFoster