找到系统的输入以实现所需的输出

时间:2013-07-24 09:49:24

标签: prolog artificial-intelligence

我有以下等式:

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

我想解决这个问题,即使对于更长的系列和更复杂的方程,这个例子也非常简单。

1 个答案:

答案 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枚举所有具体解决方案(上述情况并非如此)。