Online Prolog derleyici nasıl kullanılır
- Düzenleyiciye olgularınızı ve kurallarınızı yazın ya da Örneği sıfırla ile örnekten başlayın.
- Neyin çalışacağını belirtin:
:- initialization(main).yönergesini kullanın; buradamain, denemek istediğiniz hedefleri çağıran ve sonuçları yazdıran bir yüklemdir. - Çalıştır'a basın veya Ctrl + Enter tuşlarını kullanın (Mac'te ⌘ + Enter). Program
main.pldosyası olarak yüklenir ve yönergeleri yüklenirken çalışır. - Yazdırılan metin, hatalar ve uyarılar için Çıktı paneline bakın. 5, 15 veya 60 saniyelik bir süre sınırı seçin ve bir özyineleme hiç bitmiyorsa Durdur'u kullanın.
SWI-Prolog çalışma zamanı yaklaşık 4 MB boyutundadır ve ilk ziyaretten sonra tarayıcınız tarafından önbelleğe alınır. Programınızı Kopyala ile ya da main.pl indirmesiyle saklayın, metni A− ve A+ ile boyutlandırın, panel düzenini düzen düğmesiyle değiştirin ve daha uzun programlar için Tam ekran'ı kullanın (Ctrl/⌘ + Shift + F, çıkmak için Esc).
Her şey tarayıcınızda çalışır. Program hiçbir zaman bir sunucuya gönderilmez ve düzenleyici son sürümünüzü yalnızca tarayıcınızın yerel depolama alanına kaydeder.
Neler destekleniyor
Sayfa, WebAssembly'ye derlenmiş SWI-Prolog 10'u (swipl-wasm) kullanır. Basitleştirilmiş bir yorumlayıcı değil, gerçek SWI-Prolog sistemidir.
- Dosya yükleme (consult): kodunuz tam olarak
consult('main.pl')'in yükleyeceği gibi yüklenir; bu yüzden yan tümceler (clause), işleçler ve yönergelerin hepsi çalışır. - Çıktı yüklemleri:
format/2,write/1,writeln/1,print/1venl/0hepsi çıktı paneline yazdırır. - Listeler ve tüm çözümleri toplayan yüklemler:
member/2,append/3,length/2,msort/2,findall/3,bagof/3,setof/3,forall/2. - Aritmetik: tamsayılar ve kayan noktalı sayılar üzerinde
is/2ve karşılaştırma işleçleriyle. Örnekteki20!tam olarak hesaplanır. - SWI-Prolog'un yazdırdığı şekliyle tanılamalar; örneğin tekil değişken uyarıları ve
ERROR: ... Arithmetic: `foo/0' is not a functiongibi hatalar.
Masaüstü bir Prolog'dan farklı olanlar:
- Etkileşimli bir
?-sorgu istemi yoktur; bu yüzden sorgu yazıp daha fazla yanıt için;tuşuna basamazsınız. Sorgularımainiçine koyun ve yanıtları yazdırın ya da hepsinifindall/3veyaforall/2ile toplayın. - Standart girdi yoktur.
read/1'in okuyacak bir şeyi olmadığından test verilerinizi olgu olarak yazın.
Tek programda Prolog temelleri
% Olgular
likes(mary, wine).
likes(john, wine).
likes(john, mary).
% Bir kural: X ve Y, ikisi de aynı şeyi seviyorsa arkadaştır
friends(X, Y) :- likes(X, Z), likes(Y, Z), X \== Y.
% Bir liste üzerinde, biriktiriciyle özyineleme
sum_list_acc([], Acc, Acc).
sum_list_acc([H|T], Acc0, Sum) :- Acc1 is Acc0 + H, sum_list_acc(T, Acc1, Sum).
% Kesme (!) ilk eşleşen yan tümceye bağlanır
max(X, Y, X) :- X >= Y, !.
max(_, Y, Y).
main :-
findall(X-Y, friends(X, Y), Pairs), writeln(Pairs),
sum_list_acc([1,2,3,4], 0, S), format("sum = ~w~n", [S]),
max(3, 7, M), format("max = ~w~n", [M]).
:- initialization(main).
Çalıştırıldığında [mary-john,john-mary], sum = 10 ve max = 7 yazdırır.
Sık yapılan hatalar
=birleştirmedir (unification); atama veya aritmetik değildir.X = 1 + 2,X'i1+2terimine bağlar. Değerlendirmek içinX is 1 + 2, iki sayıyı karşılaştırmak için=:=kullanın.- Değişkenler büyük harfle veya
_ile başlar.namebir atomdur veNamebir değişkendir; bu yüzden küçük harfli bir yazım hatası bir yan tümcenin anlamını sessizce değiştirir. - Tekil değişken (singleton) uyarıları, bir değişkenin bir yan tümcede yalnızca bir kez geçtiği anlamına gelir; bu genellikle bir yazım hatasıdır. Bilerek kullanılmıyorsa adını
_veya_Nameyapın. - Kesmeyi dikkatli kullanın. Yukarıdaki
max/3,max(3, 7, M)için sorunsuzdur ama ikinci yan tümce kesmeye bağlıdır; bu yüzdenmax(5, 3, 3)yanlış biçimde başarılı olur. İkinci yan tümce olarakmax(X, Y, Y) :- X < Y.yazmak onu güvenli kılar. Yanlış yerleştirilmiş bir kesme,findall'ın aksi hâlde döndüreceği çözümleri de gizleyebilir. - Sol özyineleme döngüye girer.
ancestor(X, Y) :- ancestor(X, Z), parent(Z, Y).gibi bir kural sonsuza dek özyinelenir.parenthedefini başa koyun.
main başarılı olmak yerine başarısız olursa SWI-Prolog, başlatma hedefinin başarısız olduğuna dair bir uyarı yazdırır. Ne kadar ilerlediğini görmek için hedefler arasına writeln/1 çağrıları ekleyin.Sıkça sorulan sorular
Bir sorgu nasıl çalıştırılır?
Onu main gibi bir yüklemin içine yazın ve dosyanın sonuna :- initialization(main). ekleyin. Bir hedefi doğrudan bir yönergenin içine de koyabilirsiniz, örneğin :- X is 2^10, writeln(X).
Bu standart Prolog mu?
ISO standardını izleyen ve birçok uzantı ekleyen SWI-Prolog'dur. SWI-Prolog'da çift tırnaklı metin bir dizedir; bunun karakter kodları listesi anlamına gelmesine alışkınsanız bu önemlidir.
Bir sorgunun tüm yanıtlarını alabilir miyim?
Evet. Hepsini bir listede toplamak için findall/3'ü, örnek programın yaptığı gibi her birini yazdırmak için forall/2'yi kullanın.
Başka mantık veya işlevsel diller var mı?
Online Scheme Yorumlayıcı'yı veya Online Clojure Derleyici'yi deneyin ya da tüm online derleyicilere bakın.
Güncellendi