Prolog

2011-12-29 32 views
6

'da dinamik gerçekler oluşturmak istiyorum Aşağıdaki basit kodu yazdım ve 'erkek' yazdığımda bu kodun bana bir kez "erkek mi" diye sormasını bekliyorum. ve eğer 'Hayır' yazarsam ekranda yazıyor "o kadındır".Prolog

male :- (print('is it male ? '),read(yes)) -> true; asserta(not(male)),female. 
female:- not(male),print('she is female'). 
not(P) :- (call(P) -> fail ; true) . 

ancak bu kodu aşağıdaki gelen hata:

uncaught exception: error(permission_error(modify,static_procedure,not/1),asserta/1); 

deney hayvanlarının-Prolog hatadır:

ERROR: asserta/1: No permission to modify static_procedure `not/1' 
+1

değil/1 önceden tanımlanmış bir statik yordamdır. İsmi başka bir şeye değiştirmeyi düşünün. Ayrıca ne yaptığınızı tam olarak görmüyor. – gusbro

cevap

7

gusbro bahsedilen olarak değil,/1 önceden belirlenmiş bir statik bir işlemdir (ve bu nedenle aynı ismi kullanmak iyi bir fikir değildir).

?- assert(not(42)). 
true. 

?- not(42). 
true. 

sorun olmadığı halde zaten, kodunuzda değil/1 tanımladıktan yani: Ancak bu standart çözünürlük üzerine yazabilirsiniz as-prolog deney hayvanlarının hatayı olsun neden değildir dinamik olarak açık bir şekilde bildirme, swi-prolog statik olduğunu ve değiştirmenize izin vermeyeceğini varsayar.

Kodunuzdaki bu satırı ekleyerek o kadar dinamik ilan edebilir

:

:-dynamic(not/1). 

Ben hata mesajı permission_error(modify,static_procedure,not/1) söylediği gibi bu diğer prolog uygulamalarda problemi (örneğin gnu-prolog) çözmez düşünüyorum ; Her durumda, adı değiştirmek için şiddetle tavsiye edilir. Bu arada, argümanın ne olduğunu test etmek ve ilgili mesajı yazdırmak daha basit ve daha temiz olacaktır. Bununla birlikte, daha karmaşık bir şey (bir eyalet kullanarak) oluşturmak istiyorsanız, küresel değişkenleri kullanabilirsiniz çünkü bunlar daha etkili/geri çekilir.