7

チュートリアルで論理数のこの自然数評価に出くわしましたが、頭痛の種になっています。

natural_number(0).
natural_number(s(N)) :- natural_number(N).

このルールは大まかに次のように述べています:Nが自然数である場合、そうでない場合は、の内容が になるまで再帰的にルール0に送り返そうとします。そうでない場合は自然数ではありません。s/10

s(0)そこで、上記のロジックの実装をテストして、 as1およびs(s(0))asを表現したい場合はうまくいくと思いましたが、代わり2に に変換できるようにしたいと考えています。s(0)1

私は基本ルールを考えました:

sToInt(0,0). %sToInt(X,Y) Where X=s(N) and Y=integer of X

ここに私の質問があります: s(0) を 1 に、s(s(0)) を 2 に変換するにはどうすればよいですか?

回答済み

編集:私が受け入れた答えが私に向けた実装の基本ルールを変更しました:

decode(0,0). %was orignally decode(z,0).
decode(s(N),D):- decode(N,E), D is E +1.

encode(0,0). %was orignally encode(0,z).
encode(D,s(N)):- D > 0, E is D-1, encode(E,N).

これで思い通りに使えるようになりました、ありがとうございます!

4

3 に答える 3

6

library(clpfd)SWI、YAP、または SICStusを使用して「双方向」に機能する別のソリューションを次に示します。

:- use_module(library(clpfd)).

natsx_int(0, 0).
natsx_int(s(N), I1) :-
   I1 #> 0,
   I2 #= I1 - 1,
   natsx_int(N, I2).
于 2012-07-28T19:32:03.317 に答える