Gunakan operator aritmatika sebagai tuple konstruktor dan pasangan kontra
Jika Anda perlu melewati struktur tunggal yang terdiri dari dua atau lebih nilai, hal yang paling jelas untuk digunakan adalah daftar, misalnya [A,B] . Itu benar-benar bertele-tele.
Ada sebuah alternatif. Nilai prolog dapat menyimpan struktur bersarang yang cukup banyak, yang tidak dievaluasi. Berikut ini contoh yang menunjukkan cara kerjanya:
| ?- member(member(A,B),C).
C = [member(A,B)|_] ? ;
C = [_,member(A,B)|_] ? ;
(etc.)
member(A,B) hanya tuple bernama dalam situasi ini, dan luar member (yang merupakan panggilan fungsi) memperlakukannya seperti itu.
Meskipun tuple bernama cukup berguna dalam pemrograman Prolog non-golf, tuple ini mungkin tampak lebih bertele-tele daripada pendekatan daftar. Namun, kita dapat menggunakan cukup banyak karakter arbitrer atas nama konstruktor tuple (dengan asumsi mereka dikutip dengan benar); alih-alih sesuatu yang lucu memberatau seperti karakter tunggal a, kita dapat melakukan sesuatu seperti ini:
| ?- A = '-'('/'(1,2), '/'(3,4)).
A = 1/2-3/4
Di sini, konstruktor tuple kami adalah '-'dan '/'. Dan menarik untuk dicatat apa yang dilakukan oleh printer cantik itu; itu menggunakan notasi infiks untuk tupel. Ini benar-benar singkat, dan mem-parsing dengan cara yang sama seperti operasi aritmatika yang sebanding. (Ini juga menjelaskan mengapa penggunaan aritmatika istidak =; A = 1+2akan menyatu Adengan tuple '+'(1,2) , sehingga sintaks yang terpisah diperlukan untuk benar-benar mengevaluasi ekspresi aritmatika yang tidak dievaluasi.) Karena konstruktor tuple harus disebut sesuatu , Anda juga dapat menggunakan karakter yang memiliki karakter pendek. sintaks (dan sebagai bonus, dan adalah beberapa pilihan yang paling umum dalam kode non-golf. juga ketika mereka menginginkan pembangun tuple tuple cepat daripada sesuatu yang bermakna, dengan cara yang hampir sama-/i sering digunakan sebagai variabel loop, jadi mereka sepenuhnya masuk akal untuk digunakan dalam input dan output Anda jika Anda ingin tuple di sana karena beberapa alasan).
'-'dan '/'merupakan pilihan yang baik untuk konstruktor tuple karena konstruktornya berperilaku baik dan bermanfaat, memungkinkan Anda untuk menulis literal tuple dengan singkat. Namun, perhatikan bahwa Anda tidak perlu khawatir tentang prioritas ketika nilai-nilai antara diproduksi di dalam program. Prolog menyimpan tupel yang disimpan sebagai pohon alih-alih sebagai kode sumber, dan printer cantik dapat menampilkannya dengan jelas:
| ?- A = '-'('-'(1,2), '-'(3,4)).
A = 1-2-(3-4)
Karena sintaks tuple begitu singkat ( f(A,B)tidak lebih pendek darif(A-B) ), Anda dapat mengganti beberapa argumen predikat dengan tupel tanpa biaya, yang berarti bahwa jika predikat perlu meneruskan dua atau lebih argumennya ke predikat lain, Anda sering dapat membentuknya menjadi tuple dan hanya lulus tuple (meskipun ini akan membutuhkan perubahan semua panggilan ke predikat, selain predikat itu sendiri, untuk menggunakan campuran yang sesuai dari konstruktor dan koma tuple).
Keuntungan lain dari sintaks ini adalah jika Anda perlu menggunakan daftar secara internal (daripada untuk beroperasi dengan predikat standar); daftar pada dasarnya hanya satu set sel kontra bersarang, dan sel kontra hanya sebuah tuple dengan konstruktor'.' , seperti yang dapat dilihat di sini:
| ?- Q = '.'('.'(A,B),'.'(C,D)).
Q = [[A|B],C|D]
Jika kode Anda menggunakan daftar "secara manual", mungkin lebih masuk akal untuk menggunakan konstruktor tuple yang lebih tebal daripada '.'. Pilihan umum bagi saya adalah merepresentasikan sel kontra sebagai '/'(Tail,Head)(karena ini adalah yang paling mudah dibaca yang bisa Anda dapatkan di hasil debug tanpa membuang-buang karakter) Perhatikan bahwa Anda mungkin juga ingin yang []setara Anda sendiri ; Anda bisa menggunakannya[] tetapi panjangnya dua byte, dan ada banyak atom satu byte (semua huruf kecil) yang bisa Anda gunakan.
Jadi misalnya, daftar berikut:
[1,2,3]
dapat dikonversi menjadi representasi manual dalam jumlah karakter yang sama seperti ini:
x/3/2/1
sementara mendapatkan keuntungan yang [H|T]cocok dengan pola-gaya sekarang dapat ditulis lebih singkat T/H, dan ujian terhadap daftar kosong hanya sebagai xbukan lebih lama []. (Tentu saja, ini datang dengan kelemahan jelas bahwa member, append, dll, tidak akan bekerja pada representasi ini.)
prologtag agak sia-sia. Kecuali jika kita memiliki tantangan Menafsirkan Prolog, kita tidak membutuhkannya.