Berikut adalah spesifikasi rekursif aksi untuk blok bergerak:
r_put_on (A, B): -
pada (A, B).
r_put_on (A, B): -
tidak (pada (A, B)),
A == meja,
A == B,
clear_off (A), / * NB "action" yang digunakan sebagai prasyarat * /
clear_off (B) ,
pada (A, X),
menarik kembali (pada (A, X)),
menegaskan (pada (A, B)),
menegaskan (bergerak (A, X, B)).
clear_off (tabel). / * Berarti ada ruang di atas meja * /
clear_off (A): - / * Berarti sudah jelas * /
tidak (pada (_X, A)).
clear_off (A): -
A == meja,
pada (X, A),
clear_off (X), / * NB rekursi * /
menarik kembali (pada (X, A)),
menegaskan (pada (X, tabel)),
menegaskan (bergerak (X, A, tabel)).
Spesifikasi tindakan rekursif dapat memiliki bentuk
tindakan: - prasyarat atau tindakan,
menarik kembali (affected_old_properties),
menegaskan (new_properties).
Asumsikan lagi bahwa situasi aslinya memegang (dan yang sebelumnya 'bergerak' klausul telah ditarik):
pada (a, b).
pada (b, c).
pada (c, tabel).
Sekarang,
-? R_put_on (c, a).
ya
-? listing (di), daftar (bergerak).
(a, tabel).
pada (b, tabel).
pada (c, a).
bergerak (a, b, meja).
Langkah (b, c, tabel).
bergerak (c, meja, a).
ya
The 'put_on' tindakan telah rekursif menyebut aksi 'clear_off' sehingga 'c' bisa ditempatkan di atas 'a'.
Mari kita menambah program beberapa klausul sehingga daftar 'on' sifat dapat dibentuk bersama-sama.
melakukan (Glist): -
berlaku (Glist),
do_all (Glist, Glist).
sah(_). / * Sementara. Lihat Latihan 2.19.1 * /
do_all ([G | R], Allgoals): - / * sudah benar sekarang * /
panggilan (G),
do_all (R, Allgoals),!. / * Teruskan dengan tujuan * /
do_all ([G | _], Allgoals): - / * harus melakukan pekerjaan untuk mencapai * /
mencapai (G),
do_all (Allgoals, Allgoals). / * Kembali dan memeriksa sebelumnya tujuan * /
do_all ([], _ Allgoals). / * Selesai * /
mencapai (pada (A, B)): -
r_put_on (A, B).
Program ini sekarang dapat digunakan dengan memberikan tujuan utama dari bentuk -? Do ([...]), di mana daftar berisi berbagai pada (-, -) pernyataan subgoal (tanpa variabel). Asumsikan bahwa situasi awal mula memegang lagi; yaitu,
pada (a, b).
pada (b, c),
pada (c, tabel).
Pertimbangkan tujuan Prolog
-? Do ([di (a, meja), pada (b, a), pada (c, b)]).
ya
-? listing (di), daftar (bergerak).
(a, tabel).
pada (b, a).
pada (c, b).
bergerak (a, b, meja).
Langkah (b, c, a).
bergerak (c, meja, b).
ya
Pembaca harus mencoba tujuan dan daftar program yang dihasilkan untuk sebagian memverifikasi bahwa ini bekerja dengan cara yang kita telah diklaim. Program ini tidak ada yang istimewa dengan rencana, selain memasukkan pada akhir program. Untuk menghasilkan rencana lain untuk pengaturan awal yang sama, namun kondisi tujuan yang berbeda, satu bisa muat ulang plans.pro pertama. Ketidaknyamanan ini bisa dihilangkan dengan beberapa cara, tergantung pada bagaimana seseorang dimaksudkan untuk menggunakan program (lihat latihan untuk lebih lanjut tentang ini).
Memberikan perhatian khusus bagaimana program mencoba untuk memenuhi daftar tujuan individu. Definisi predikat 'do-semua' dalam program ini harus dipelajari dengan hati-hati. Dalam memuaskan daftar tujuan individu, setiap tujuan yang bekerja pada dari kiri ke kanan. Jika tujuan individu sudah puas, kemudian dilanjutkan ke tujuan berikutnya. Jika tidak memenuhi tujuan saat ini, tetapi kemudian kembali ke awal daftar untuk memeriksa bahwa tujuan sebelumnya masih puas. Bekerja pada mereka lagi jika mereka tidak masih puas. Berulang kali melakukan hal ini sampai semua tujuan individu dalam daftar puas (jika mungkin).
The strip sistem perencanaan, dijelaskan dalam Nilsson (1980), operator yang digunakan terdiri dari tiga komponen:
rumus Prekondisi, yang harus benar agar para
operator untuk berlaku;
Hapus-list, yang terdiri dari predikat dibuat palsu oleh
tindakan;
Add-daftar, yang terdiri dari predikat dibuat benar oleh
tindakan.
Yang terakhir 'clear_off' klausa dapat ditandai dengan cara strip, sebagai berikut:
clear_off (A):
Prasyarat: A == meja, pada (X, A), clear_off (X)
Hapus-list: on (X, A )
Add-daftar: pada (X, meja), bergerak (X, A, table)
Sebenarnya ini akan sesuai dengan versi rekursif dari strip (RSTRIPS) untuk alasan yang sama bahwa program kami digunakan spesifikasi tindakan rekursif. Program yang disajikan di sini menggunakan Prolog sebagai mesin kontrol inferensi, sedangkan strip memiliki inferensi dan kontrol sendiri strateginya. Sebuah proyek yang baik akan membaca lebih lanjut tentang strip, dan kembali menerapkannya dalam Prolog.
The Prolog perencanaan program menggambarkan beberapa masalah perencanaan lainnya. Suatu hal yang penting untuk diperhatikan adalah bahwa tujuan individu mungkin tidak independen satu sama lain. Misalnya, menggunakan konfigurasi awal asli, misalkan kita berpose tujuan
-? Do ([di (c, b), pada (b, a), (a, tabel)]).
yang merupakan kebalikan dari tujuan sebelumnya. Kali ini, rencana berikut dihasilkan.
bergerak (a, b, meja).
Langkah (b, c, tabel).
bergerak (c, meja, b).
Langkah (c, b, meja).
Langkah (b, meja, a).
bergerak (c, meja, b).
Bandingkan rencana ini dengan satu sebelumnya dihasilkan. Rencana ini memiliki bergerak berlebihan (seperti tengah dua), dan tidak sebaliknya mencapai hubungannya akhir gol dalam efisien
Sedang diterjemahkan, harap tunggu..
