프롤로그의 부울 통합?

Nov 14 2020

나는 다음과 같은 문제로 오랫동안 항상 고군분투하고 있습니다. Prolog의 일반적인 통합을 더 스마트하게 만들고 싶습니다.

기본적으로 특정 변수가 예를 들어 0 = ~ 1 및 1 = ~ 0을 이해하기를 원합니다. 이것은 정상적으로 작동하지 않습니다.

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

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

CLP (B)가 할 수 있다는 것을 알고 있습니다.

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.

하지만 전체 CLP (B) 라이브러리를로드하는 것보다 더 가벼운 것이 필요합니다. 어떤 아이디어?

답변

MostowskiCollapse Nov 14 2020 at 23:45

SWI-Prologs 는 작업을 수행 할 때 입니다. 여기 에서 Quine 알고리즘을 사용하여 부울 표현식을 부분적으로 평가하고 있습니다. 그런 다음 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).

위의 술어는 표현식 내부의 일부 변수가 변경 될 때마다 변수 X에 할당 된 표현식을 재평가합니다. 표현식은 when / 2까지 변수 X와 연관됩니다. 최상위 레벨에서 when / 2를 볼 수 있으므로 연관된 표현식을 볼 수 있습니다.

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

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

또한 사용 사례 등을 수행 할 수 있습니다.

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