如何将约束添加到由明确的子句语法生成的列表中?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将约束添加到由明确的子句语法生成的列表中?相关的知识,希望对你有一定的参考价值。

我正在尝试在prolog中使用明确的子句语法来接受u,2,v形式的字符串,其中u是0和1的字符串。存在约束,其中'u'中的零的数量必须等于'v'中的1的数量。

我可以让解释器接受u,2,v的字符串但是我在添加约束时遇到了麻烦。

s--> t,
{t(Input,[]),
 find_zeroes(Input,X),length(X,Z),
 reverse(Input,RevInput),find_ones(RevInput,Y),length(Y,Z)}.

t --> [2].
t --> l,[2],r.

l --> [X],{member(X,[0,1])}.
l --> [X],l,{member(X,[0,1])}.
r --> [Y],{member(Y,[0,1])}.
r --> [Y],r,{member(Y,[0,1])}.



accfindzeroes([H|T],Acc,Result):- H = 0, accfindzeroes(T,[H|Acc],Result).
accfindzeroes([H|T],Acc,Result):- H = 0, accfindzeroes(T,Acc,Result).

accfindzeroes([2|_],Acc,Acc).
find_zeroes(List,Result):-accfindzeroes(List,[],Result).


accfindones([H|T],Acc,Result):-  H = 1, accfindones(T,[H|Acc],Result).
accfindones([H|T],Acc,Result):- H = 1, accfindones(T,Acc,Result).

accfindones([2|_],Acc,Acc).
find_ones(List,Result):-accfindones(List,[],Result).

例如:

    ?- t([0,1,1,2,1,0,0],[]).
    True.

根据需要,但是,

    ?- s([0,1,1,2,1,0,0],[]).

无限循环......

我很确定问题出在第二行,但我不知道如何纠正它。我认为问题是't'在尝试解决约束之前没有输出列表所以它不起作用但是我说我有点卡住了。

答案

这似乎是一个duplicate问题,但我已经编写了代码。

t --> [2].
t --> l(N),[2],r(N).

l(0) --> [].
l(N) --> [0],l(N0), { N is N0 + 1 }.
l(N) --> [1],l(N).

r(0) --> [].
r(N) --> [0],r(N).
r(N) --> [1],r(N0), { N is N0 + 1 }.

你的问题是调用t(Input,[])只会产生更长和更长的序列,而与你的输入没有任何关联。

以上是关于如何将约束添加到由明确的子句语法生成的列表中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串字段添加到由流形成的字符串列表中

仅将 CSS 代码添加到由 WP 插件生成的页面

SQLSTATE [23000]:完整性约束违规:1052 列“created_at”在 order 子句中不明确 Laravel 5.5

SQLSTATE [23000]:违反完整性约束:1052 where 子句中的列 'tenant_id' 不明确

如何巢发电机

如何使用点图元将纹理映射到由参数方程渲染的球体