Prolog中的列表练习列表
我有以下练习: 编写一个成功的确定性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选择第
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
.