【问题标题】:Making tuples out of two lists从两个列表中创建元组
【发布时间】:2020-04-10 07:19:30
【问题描述】:

我是 Prolog 的初学者,我有两个使用递归从两个列表中生成元组。例如,func ([1, 2, 3], [4, 5, 6]) 应该输出 [(1, 4), (1,5), (1,6), (2, 4), (2 , 5), (2, 6), (3, 4), (3,5), (3, 6)]。我有以下代码:

func([],_,[]).
func([X|T1],Y,[Z|W]):-
    match(X,Y,Z),
    func(T1,Y,W).

match(X,[Y],[(X,Y)]).
match(X,[Y|T],[(X,Y)|Z]) :-
    match(X,T,Z).

但是我对 func([1,2,3],[4,5,6],X) 的输出是 X = [[(1, 4), (1, 5), (1, 6)], [(2, 4), (2, 5), (2, 6)], [(3, 4), (3, 5), (3, 6)]].

如何去掉输出中间多余的方括号?我已经尝试在我的两个函数中使用括号和括号,但我无法弄清楚。

【问题讨论】:

标签: list prolog


【解决方案1】:

使用findall/3 标准谓词和member/2 事实上的标准谓词:

| ?- findall(X-Y, (member(X,[1,2,3]), member(Y,[4,5,6])), Pairs).

Pairs = [1-4,1-5,1-6,2-4,2-5,2-6,3-4,3-5,3-6]
yes

要理解这个解决方案,请注意,对于X 的每个值,我们通过回溯Y 的所有值来枚举。 IE。当回溯时(由 findall/3 谓词隐式执行以构造其第二个参数的所有解决方案的列表),我们在回溯到前一个选择点之前耗尽最后一个选择点(member(Y,[4,5,6]) 目标)的所有解决方案(member(X,[1,2,3]) 目标)。这被称为时序回溯,是 Prolog 的定义特征之一。

请注意,我使用了X-Y,这是 pair 的常用 Prolog 表示,而不是 (X,Y),这不是构造 n 元组的推荐解决方案,因为它仅适用于对元素。

【讨论】:

    猜你喜欢
    • 2022-12-08
    • 2015-04-29
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2020-02-16
    相关资源
    最近更新 更多