Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.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
Prolog中的列表练习列表_Prolog_Swi Prolog - Fatal编程技术网

Prolog中的列表练习列表

Prolog中的列表练习列表,prolog,swi-prolog,Prolog,Swi Prolog,我有以下练习: 编写一个成功的确定性Prolog程序test(+List,?Integer) 当且仅当Integer是列表中两个不同元素的方式数 可以选择,以便第一个元素正好比第一个元素多一个元素 第二 示例查询: ?- test( [ [], [0], [0,0], [0,1], [1,0] ], N ). N = 5 但我不知道我该怎么做。希望有人能提供帮助这里有一个想法,同时完全消除对性能的任何想法: 次级目标: 使用member/2选择第一个元素(列表);及 使用member/2选择第

我有以下练习:

编写一个成功的确定性Prolog程序
test(+List,?Integer)
当且仅当
Integer
列表中两个不同元素的方式数
可以选择,以便第一个元素正好比第一个元素多一个元素
第二

示例查询:

?- test( [ [], [0], [0,0], [0,1], [1,0] ], N ).
N = 5

但我不知道我该怎么做。希望有人能提供帮助

这里有一个想法,同时完全消除对性能的任何想法:

次级目标:

  • 使用
    member/2
    选择第一个元素(列表);及
  • 使用
    member/2
    选择第二个元素(列表);及
  • 使用
    length/2
    计算第一个选定元素/列表的长度;及
  • 使用
    length/2
    计算第二个选定元素/列表的长度;及

  • 请确保这两个长度符合您的长度约束,使用
    Prolog可以。。。当你刚开始的时候,很难把头绕过去

    首先,尝试编写一个谓词,该谓词在回溯时将返回列表的整个笛卡尔连接,如下所示:

    test( List, result( A, B ) ) :-
      member( A, List ),
      member( B, List )
      .
    
    使用测试数据运行:
    test([[],[0],[0,0],[0,1],[1,0]],R)。
    将依次返回25个结果(示例列表中有5个项目,因此5×5会给我们25个结果,对吗?)

    一旦有了这些,就可以很容易地计算出两个子列表之间的长度差:

    test( List, result( A, B ) ) :-
      member( A, List ),
      member( B, List ),
      length( A, L1   ),
      length( B, L2   ),
      Delta is L1 - L2
      .
    
    而且更容易过滤:

    test( List, result( A, B ) ) :-
      member( A, List ),
      member( B, List ),
      length( A, L1   ),
      length( B, L2   ),
      Delta is L1 - L2,
      Delta = 1
      .
    

    如何使用memeber选择元素?@fewfrg查看手册:并在命令行或中尝试。没有其他学习方法。
    test( List, result( A, B ) ) :-
      member( A, List ),
      member( B, List ),
      length( A, L1   ),
      length( B, L2   ),
      Delta is L1 - L2,
      Delta = 1
      .