Penyatuan Boolean dalam Prolog?
Saya berjuang untuk waktu yang lama dengan masalah berikut ini. Saya ingin membuat penyatuan Prolog yang biasa menjadi lebih pintar.
Pada dasarnya saya ingin variabel tertentu memahami bahwa misalnya 0 = ~ 1 dan 1 = ~ 0. Ini tidak bekerja secara normal:
?- op(300, fy, ~).
true.
?- X = ~Y, Y = 0.
X = ~0,
Y = 0.
Saya tahu bahwa CLP (B) dapat melakukannya:
Welcome to SWI-Prolog (threaded, 64 bits, version 8.3.7)
:- use_module(library(clpb)).
true.
?- sat(X=:= ~Y), Y = 0.
X = 1,
Y = 0.
Tapi saya membutuhkan sesuatu yang lebih ringan daripada memuat pustaka CLP (B) lengkap. Ada ide?
Jawaban
Tampaknya SWI-Prologs ketika / 2 melakukan pekerjaan itu. Saya menggunakan algoritma Quine dari sini untuk mengevaluasi sebagian ekspresi boolean. Saya kemudian dapat mendefinisikan predikat Boolean let / 2:
let(X, Y) :-
eval(Y, H),
term_variables(H, L),
( L== [] -> X = H;
cond(L, R),
when(R, let(X, H))).
cond([X], nonvar(X)) :- !.
cond([X,Y|Z], (nonvar(X);T)) :-
cond([Y|Z], T).
Predikat di atas akan mengevaluasi kembali ekspresi yang ditetapkan ke variabel X ketika beberapa variabel di dalam ekspresi berubah. Ekspresi tersebut diasosiasikan dengan variabel X melalui when / 2. Karena kita melihat when / 2 di tingkat atas, kita melihat ekspresi terkait:
?- let(X, ~Y).
when(nonvar(Y), let(X, ~Y))
?- let(X, Y+Z).
when((nonvar(Y); nonvar(Z)), let(X, Y+Z))
Dan kami juga dapat melakukan kasus penggunaan kami dan bahkan lebih:
?- let(X, ~Y), Y = 0.
X = 1,
Y = 0.
?- let(X, Y+Z), Y = 0.
Y = 0,
when(nonvar(Z), let(X, Z))
?- let(X, Y+Z), Y = 0, Z = 1.
X = 1,
Y = 0,
Z = 1