首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog中的布尔合一?

Prolog中的布尔合一?
EN

Stack Overflow用户
提问于 2020-11-14 22:58:08
回答 1查看 90关注 0票数 2

我已经为以下问题挣扎了很长一段时间。我想让通常的Prolog统一更加智能。

基本上,我希望某些变量能够理解,例如0= ~1和1= ~0。这不能正常工作:

代码语言:javascript
复制
?- op(300, fy, ~).
true.

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

我知道中电(B)是可以做到的:

代码语言:javascript
复制
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)库更轻量级的东西。有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2020-11-15 00:45:33

似乎SWI-Prologs when/2可以完成这项工作。我正在使用here的Quine算法对布尔表达式进行部分求值。然后我可以定义一个布尔值let/2谓词:

代码语言:javascript
复制
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的表达式。该表达式与变量X到when/2相关联。因为我们在顶层看到的是when/2,所以我们看到的是关联的表达式:

代码语言:javascript
复制
?- let(X, ~Y).
when(nonvar(Y), let(X, ~Y))

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

我们还可以做我们的用例,甚至更多:

代码语言:javascript
复制
?- 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64835191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档