2016-09-28 4 views
1

ここでは2つの入力の加算コードです(X + 1とYの結果がZ + 1の場合、結果はZになります)。さらに2つの入力に加えて後継関数を使用するにはどうすればよいですか?

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

    pl(0,X,X) :- natural_number(X). 
    pl(s(X),Y,s(Z)) :- pl(X,Y,Z). 

は、しかし、私はそれは私たちが事前にありがとう

pl(s(0),s(s(0)),s(s(s(0))),W) 
    and got a result W = s(s(s(s(s(s(0)))))) 

のような3つのコンポーネントのための同様のコードを使用することができるだろう。

+0

最初に2番目を追加し、3番目に結果を追加しますか? –

+1

終了に関する理由の一般的なアプローチについては、[この回答](http://stackoverflow.com/a/10141181/772868)を参照してください。短い場合は – false

答えて

1
pl(A, B, C, Sum) :- 
    pl(A, B, Tmp), 
    pl(Tmp, C, Sum). 

それとも、あなたは自然数のリストを追加したい場合は、当然のことながら、その上に折り畳みを行うことができます。

pl([], 0). 
pl([N|Ns], Sum) :- 
    foldl(pl, Ns, N, Sum). 

あるいは(CapelliCの提案の後):

pl(Ns, Sum) :- foldl(pl, Ns, 0, Sum). 

PS:後継表記を使用することは必ずしも良い考えではありません。少なくとも1つの有効な使用は、それを使用して、キューの長さを追跡することです(this answer)。

+2

? (pl、Ns、0、Sum)。 – CapelliC

+1

'' pl/4''は非常に悪い終了を持っています: '' pl(A、B、C、D)terminates_if b(A)、 b(B)、b(C)、b(A)、b(B)、b(D)自然数%280%29.%0D%0自然数%28s%28X%29%29 +%3A- +自然数%28X%29.%0D%0A%0D%0Apl%280%2CX%2CX%29 +%3A + +自然数%28X%29.%0D%0Apl%28s%28X%29%2CY%2Cs%28Z%29%29 +%3A- + pl%28X%2CY%2CZ%29.%0D%0A%0D%0Apl% 28A%2C + B%2C + C%2C + Sum%29 +%3A-%0D%0A ++++ pl%28A%2C + B%2C + Tmp%29%2C%0D%0A ++++ %2C + C%2C + Sum%29) – false

+0

@false後継表記算術の終了については、ここで議論しています。 –

関連する問題