gpt4 book ai didi

list - Prolog:如何在两个列表(嵌套 for 循环)之间进行迭代?

转载 作者:行者123 更新时间:2023-12-01 11:15:15 26 4
gpt4 key购买 nike

我这周才开始学习 Prolog,所以我不确定 Prolog 中是否可以使用 for 循环。我在 Prolog 中有两个列表

stringList([hi,hello],[bye,later],X).

如何创建一个新的解决方案列表,每个列表一个元素?

所以输出应该是:

X = [hi,bye]
X = [hi,later]
X = [hello,bye]
X = [hello,later]

最佳答案

使用 Prolog 的一个主要优势是您可以委托(delegate)这样的循环给 Prolog 引擎。您不必明确地编写它们。

例如,在您的情况下,以这种方式思考问题:持有(或应该持有)X 的内容是什么?/p>

我们可以说:

  1. X 是一个包含两个元素的列表,比如 [A,B]
  2. A 是第一个参数表示的列表的成员。
  3. B 是列表的成员,由第二个参数表示。

因此,在 Prolog 中:

one_from_each(As, Bs, [A,B]) :-    member(A, As),    member(B, Bs).

示例查询:

?- one_from_each([hi,hello],[bye,later], X).X = [hi, bye] ;X = [hi, later] ;X = [hello, bye] ;X = [hello, later].

它也适用于其他方向:

?- one_from_each(As, Bs, [hi,bye]).As = [hi|_4656],Bs = [bye|_4662] ;As = [hi|_4656],Bs = [_4660, bye|_4668] ;As = [hi|_4656],Bs = [_4660, _4666, bye|_4674] .

因此,整个问题有些误入歧途。在 Prolog 中编码时,总是要问:我如何制定应该持有的内容?一旦有了这样的公式,您就可以将解决方案的搜索留给 Prolog 引擎!

如果你想要,你可以更明确。例如:

one_from_each([], _) --> [].one_from_each([L|Ls], Rs) -->    one_from_each_(Rs, L),    one_from_each(Ls, Rs).one_from_each_([], _) --> [].one_from_each_([R|Rs], L) -->    [[L,R]],    one_from_each_(Rs, L).

例子:

?- phrase(one_from_each([hi,hello],[bye,later]), Ls).Ls = [[hi, bye], [hi, later], [hello, bye], [hello, later]].

这有时称为空间表示,因为现在不再在回溯(时间表示)上找到解决方案,而是明确表示。

由此,您可以看到“循环”对应于递归 定义。

关于list - Prolog:如何在两个列表(嵌套 for 循环)之间进行迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52713369/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com