Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erlang 为基于属性的测试生成随机规则_Erlang_Quickcheck_Triq - Fatal编程技术网

Erlang 为基于属性的测试生成随机规则

Erlang 为基于属性的测试生成随机规则,erlang,quickcheck,triq,Erlang,Quickcheck,Triq,我正在使用(erlang quickcheck),为我的程序生成一组好的规则时遇到了问题 我要生成的内容如下所示: A -> B {rule, [a], [1,2,4,5]} {rule, [a], [a,d,c,e]} {rule, [a], [q,d,3,4]} 我想提供A和B的大小,后者没有任何副本 例如,如果我说使用大小为4的L.H.S.[a]和R.H.S.生成规则(即a=[a]和size(B)=4),我希望得到如下结果: A -> B {rule, [a], [1,2

我正在使用(erlang quickcheck),为我的程序生成一组好的规则时遇到了问题

我要生成的内容如下所示:

A -> B
{rule, [a], [1,2,4,5]}
{rule, [a], [a,d,c,e]}
{rule, [a], [q,d,3,4]}
我想提供
A
B
的大小,后者没有任何副本

例如,如果我说使用大小为4的L.H.S.
[a]
和R.H.S.生成规则(即
a=[a]
size(B)=4
),我希望得到如下结果:

A -> B
{rule, [a], [1,2,4,5]}
{rule, [a], [a,d,c,e]}
{rule, [a], [q,d,3,4]}
注意,我不想在B中出现任何重复(这是我遇到麻烦的部分)。同样,B由什么组成并不重要——它可以是任何东西,只要它是独特的,没有重复


我的规范太凌乱,无法在这里显示,所以我不想在这里显示。

我不熟悉Triq,但在property和Quviq的Qickcheck中,您可以使用过滤“坏”实例的条件

如果生成的实例不满足这样的约束,它将被丢弃,并且不会被视为有效测试。您可以使用此机制生成指定大小的列表(即适当调用的“向量”),然后丢弃那些具有重复项的列表,但我认为会丢弃太多实例(另请参见链接)

通常更有效的方法是修补生成器,使所有的实例都有效,例如生成(3)X倍的元素,删除重复项并保留所需的数量。这仍然可能失败,而且它将失败,因此您需要防范它

以下是适用于您的案例的生成器,以及一个虚拟属性:

-module(dummy).

-export([rule_prop/0]).

-include_lib("proper/include/proper.hrl").

-define(X, 5).

rule_prop() ->
  ?FORALL(_, rule_gen(integer(), 4, integer()), true).

rule_gen(A, SizeB, TypeB) ->
  ?LET(
     EnoughB,
     ?SUCHTHAT(
        NoDupB,
        ?LET(
           ManyB,
           vector(?X * SizeB, TypeB),
           no_dups(ManyB)
          ),
        length(NoDupB) >= SizeB
       ),
     begin
       B = lists:sublist(EnoughB, SizeB),
       {rule, A, B}
     end).

no_dups([]) ->
  [];
no_dups([A|B]) ->
  [A | no_dups([X || X <- B, X =/= A])].
-模块(虚拟)。
-导出([rule_prop/0])。
-include_lib(“property/include/property.hrl”)。
-定义(X,5)。
规则_prop()->
?FORALL(u,rule_gen(integer(),4,integer()),true)。
规则(A、尺寸B、类型B)->
?让(
伊诺布,
?诸如此类(
诺杜布,
?让(
很多,
向量(?X*SizeB,B型),
无重复(多个)
),
长度(nodubb)>=SizeB
),
开始
B=列表:子列表(EnoughB,SizeB),
{规则,A,B}
(完)。
无重复([])->
[];
无重复([A | B])->

[A | no | u dups([X | | | X谢谢,只有一个问题:为什么我们生成的数量是3倍?数字3是特殊的,还是你的意思是我们只需要生成比需要更多的?不,它不是,它只是“确保”删除重复项后将保留足够多的不同元素。这是否总是会生成某些内容?哦,好的,我终于得到了它。您只生成比所需更大的列表,然后将它们变小。非常感谢。这意味着
?这样的
失败时,元素的数量只有原来的3倍。对于包含10个唯一
整数()的列表
elements,50个元素似乎还可以,但这可能也是一个适当的错误。