2016-03-19 35 views
1

Prolog'da yeniyim ve yerleşik yüklemleri kullanmadan doğal sayılar üzerinde bazı temel aritmetik işlemleri gerçekleştirmem gerekiyor.Prolog - bazı temel aritmetik işlemleri uygulaması

Unary notaion'da doğal sayı terimini temsil ediyorum, yani 0 sabitine ve tekrarlayan halefi halefi hale getirici s [i.e. 4 = s (s (s (s (0))))]. Yukarıdaki notasyona göre aritmetik işlemleri uygularım.

kurallar kümesidir:

% nat(N)/1 ---> N is a natural number 
nat(0). 
nat(s(X)) :- 
    nat(X). 

% add(X,Y,Z)/3 ---> Z = X + Y 
add(X,0,X) :- 
    nat(X). 
add(X,s(Y),s(Z)) :- 
    add(X,Y,Z). 

% mult(X,Y,Z)/3 ---> Z = X * Y 
mult(0,X,0) :- 
    nat(X). 
mult(s(X),Y,Z) :- 
    mult(X,Y,XY), 
    add(XY,Y,Z). 

şimdi, ben sorguladığınızda:

?- mult(s(s(0)), s(s(s(0))), RES). 

tamam her şeyi elde:

RES = s (s (lar (lar (ler (s (0)))))).

Ben sorguladığınızda:

?- mult(X, s(s(s(0))), s(s(s(s(s(s(0))))))). 

Ben sonsuz döngüye girdi ve S.Ö. olsun (? 6/3 = sormak)

mult(s(X),Y,Z) :- 
    add(XY,Y,Z), 
    mult(X,Y,XY). 

ben linux makinede kesicileri-prolog çalıştırın:

ben yardımcı olmuyor mult yüklemi özyinelemeli çağrı sırasını değiştirmek bile.

Tavsiyenizi takdir edeceksiniz! Sonra mult

% add(X,Y,Z)/3 ---> Z = X + Y 
add(0,X,X) :- 
    nat(X). 
add(s(X),Y,s(Z)) :- 
    add(X,Y,Z). 

ve:

mult(s(X),Y,Z) :- 
    add(XY,Y,Z), 
    mult(X,Y,XY). 

istenilen sonucu verecektir

cevap

0

Tamam, hızlı bir düzeltme (yanlış özyineleme) bulunmaktadır.

yapılmamış, bulunan:

?- mult(X,Y,s(s(s(s(s(s(0))))))). 

bu çıktısı tekabül X, Y her çiftleri: X * Y, = s (s (s (s (s (s (0)))))) ve son çiftten sonra, bilinmeyen bir nedenden ötürü sonsuz döngü içine girecek.