Saya ingin tahu apakah ada penerjemah meta Prolog murni dengan hanya satu aturan. Meta-interpreter Prolog vanilla biasa memiliki dua aturan. Bunyinya sebagai berikut:

solve(true).
solve((A, B)) :- solve(A), solve(B). /* rule 1 */
solve(H) :- program(H, B), solve(B). /* rule 2 */

Meta-interpreter Prolog vanilla ini menggunakan dua aturan /* rule 1 */ dan /* rule 2 */. Dan sisanya adalah fakta. Program yang dieksekusi diwakili oleh fakta program. Berikut adalah contoh programnya:

program(append([], X, X), true).
program(append([X|Y], Z, [X|T]), append(Y, Z, T)).
program(nrev([], []), true).
program(nrev([H|T], R), (nrev(T, S), append(S, [H], R))).

Dan contoh kueri:

?- solve(nrev([1,2,3], X)).
X = [3, 2, 1] .

Apakah ada cara untuk mewakili program secara berbeda sebagai fakta, dan kemudian mengkodekan meta-interpreter yang berbeda, yang hanya akan menggunakan fakta kecuali untuk satu aturan, bukan dua aturan? Sesuatu yang akan bekerja untuk semua program Prolog murni, bukan hanya contoh nrev?

2
Mostowski Collapse 23 Desember 2020, 17:32

2 jawaban

Jawaban Terbaik

Berikut adalah satu ide, menggunakan daftar untuk menampung sisa perhitungan:

solve([]).
solve([X|Xs]) :- program(X, Ys, Xs), solve(Ys).

program(true, Xs, Xs).
program(append([],X,X), Xs, Xs).
program(append([X|Y], Z, [X|T]), [append(Y,Z,T)|Xs], Xs).
program(nrev([],[]), Xs, Xs).
program(nrev([H|T],R), [nrev(T,S),append(S,[H],R)|Xs], Xs).

Dengan panggilan uji (di mana seseorang perlu membungkus panggilan dalam daftar).

?- solve([nrev([1,2,3],X)]).
X = [3,2,1] ? ;
no

Diperdebatkan, seseorang dapat mewakili fakta program/3 sebagai DCG sebagai gantinya, untuk meningkatkan keterbacaan (tetapi kemudian mungkin tidak dianggap sebagai "fakta" lagi).

4
jnmonette 23 Desember 2020, 16:05

Jika ;/2 diizinkan, maka ini tampaknya berhasil:

solve(true).
solve(H) :- ((X, Y) = H, solve(X), solve(Y)); (program(H :- B), solve(B)).

program(append([], X, X) :- true).
program(append([X|Y], Z, [X|T]) :- append(Y, Z, T)).
program(nrev([], []) :- true).
program(nrev([H|T], R) :- (nrev(T, S), append(S, [H], R))).

Uji:

?- solve(nrev([1,2,3], X)).
X = [3, 2, 1] ;
false.
0
bobcat 23 Desember 2020, 15:47