我有以下等式:
y(t) = x(t) and not x(t-1)
x, y are boolean variables
t is discrete time
是边缘检测器。 我进一步知道
y(0) = 0
y(1) = 0
y(2) = 1
y(3) = 0
y(4) = 0
和初始条件
x(0) = 1
x(4) = 0
我想解决这个等式,以便找到x(1), x(2), x(3)
的令人满意的值。对于这个例子,我希望其中一个解决方案是:
x(1) = 0
x(2) = 1
x(3) = 1
我是Prolog的初学者,但我认为Prolog正是可用于解决此类任务的东西。我会把预期的输出和初始条件写成事实:
y(0,0).
y(1,0).
y(2,1).
y(3,0).
y(4,0).
x(0,1).
x(4,0).
和方程式self作为谓词。如何将方程重写为Prolog谓词以及如何查询x
?是否有可能获得所有的灵魂?
非常感谢每一个想法!
祝福。
约束中存在错误(如果我使用这个术语)。
由x(t)
刺激的等式(系统)将给出特定的y(t)
x(t): 1 0 1 0 0
y(t): X 0 1 0 0
t : 0 1 2 3 4
其中X
表示“我们不知道”,因为x(-1)
计算需要知道y(0)
。
当x(t)
已知时,任务是为t in 1..4
计算y(t)
。
可以请求x(0)
和x(4)
具有特定值。这只会影响解决方案的数量,但正如我所想,它对于任务的本质并不重要。
对于给定的
y(t): X 0 1 0 0
t : 0 1 2 3 4
有两种解决方案:
S1:
x(t): 1 0 1 0 0
y(t): X 0 1 0 0
t : 0 1 2 3 4
S2:
x(t): 1 0 1 1 0
y(t): X 0 1 0 0
t : 0 1 2 3 4
如果x(t)
没有初始/最终约束,则至少还有以下解决方案:
S3:
x(t): 1 0 1 1 1
y(t): X 0 1 0 0
t : 0 1 2 3 4
S4:
x(t): 0 0 1 0 0
y(t): X 0 1 0 0
t : 0 1 2 3 4
S5:
x(t): 0 0 1 1 0
y(t): X 0 1 0 0
t : 0 1 2 3 4
S6:
x(t): 0 0 1 1 1
y(t): X 0 1 0 0
t : 0 1 2 3 4
我想解决这个问题,即使对于更长的系列和更复杂的方程,这个例子也非常简单。
答案 0 :(得分:1)
考虑在布尔变量或有限域上使用约束求解器。例如,使用SWI-Prolog:
:- use_module(library(clpfd)).
edge(Xs, Ys) :-
Xs = [X0,X1,X2,X3,X4],
Ys = [_Y0,Y1,Y2,Y3,Y4],
Xs ins 0..1,
Ys ins 0..1,
X0 = 1,
X4 = 0,
Ys = [0,0,1,0,0],
Y1 #= X1 #/\ Y1 #\= X0,
Y2 #= X2 #/\ Y2 #\= X1,
Y3 #= X3 #/\ Y3 #\= X2,
Y4 #= X4 #/\ Y4 #\= X3.
我明白了:
?- edge(Xs, Ys).
false.
因此,假设我理解并正确建模,您的约束不承认解决方案。当我注释掉最后一个约束时,我得到了一个独特的解决方案:
?- edge(Xs, Ys).
Xs = [1, 0, 1, 0, 0],
Ys = [0, 0, 1, 0, 0].
从中可以清楚地看出,Y4
无法满足这些给定Xs
的最终约束,因为它必须同时为0
且与0
不同( Xs
)中的最后两个元素。当答案中仍有变量时,您可以使用label/1
枚举所有具体解决方案(上述情况并非如此)。