Prolog'da Boole birleşimi?

Nov 14 2020

Şu problemle uzun zamandır mücadele ediyorum. Prolog'un olağan birleşimini daha akıllı hale getirmek istiyorum.

Temel olarak, bazı değişkenlerin örneğin 0 = ~ 1 ve 1 = ~ 0 olduğunu anlamasını istiyorum. Bu normal çalışmıyor:

?- op(300, fy, ~).
true.

?- X = ~Y, Y = 0.
X = ~0,
Y = 0.

CLP'nin (B) bunu yapabileceğini biliyorum:

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.

Ancak tam bir CLP (B) kitaplığı yüklemekten daha hafif bir şeye ihtiyacım var. Herhangi bir fikir?

Yanıtlar

MostowskiCollapse Nov 14 2020 at 23:45

Görünüşe göre SWI-Prologs / 2 işi yaptığında. Bir boole ifadesini kısmen değerlendirmek için buradan Quine algoritmasını kullanıyorum . Daha sonra bir Boolean let / 2 yüklemi tanımlayabilirim:

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).

Yukarıdaki koşul, ifade içindeki bazı değişkenler değiştiğinde X değişkenine atanan ifadeyi yeniden değerlendirecektir. İfade, X değişkeni ile / 2 arasında ilişkilendirilir. Üst seviyede ne zaman / 2 olduğunu gördüğümüzden, ilişkili ifadeyi görüyoruz:

?- let(X, ~Y).
when(nonvar(Y), let(X, ~Y))

?- let(X, Y+Z).
when((nonvar(Y); nonvar(Z)), let(X, Y+Z))

Ayrıca kullanım durumumuzu ve daha fazlasını da yapabiliriz:

?- 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