【问题标题】:Prolog Recursion through a listProlog 通过列表递归
【发布时间】:2020-04-29 02:45:41
【问题描述】:

我想要一个遍历列表列表并检查每个列表是否验证某些条件的谓词,以防列表验证条件,它将被添加到 ResultList(另一个列表列表)。我是这样写的:

mypredicate(ListOfLists, ReferenceList, ResultList) :-
    mypredicate(ListOfLists, ReferenceList, ResultList, []),

mypredicate([H|T], ReferenceList, ResultList, Acc) :-
    elementos_comuns(ReferenceList, H),
    H \== ReferenceList,
    append(Acc, H, ResultList),
    T \== [],
    mypredicate(T, ReferenceList, ResultList, ResultList).

如果“附加”上方的两行都返回 true,我只想追加,并且无论前 3 行发生什么,如果 T \== [],我希望它运行最后一行。

问题在于,当它到达 ListOfLists 的一个元素时,它不能验证这两个:

elementos_comuns(ReferenceList, H),
H \== ReferenceList,

整个事情都返回假。

我需要 ResultList 是一个列表列表,其中包含“ListOfList”中验证的列表

elementos_comuns(ReferenceList, H),
H \== ReferenceList,

我不知道该怎么做,感谢任何帮助。

【问题讨论】:

    标签: prolog


    【解决方案1】:

    假设你用一些列表[A, B, C] 调用mypredicate。它将检查A 上的一些条件,然后使用[B, C] 进行递归。它将检查B 上的一些条件,然后使用[C] 进行递归。它将检查C 上的一些条件,但是由于T 现在是[],它将在T \== [] 处失败。当你有这个条件时,你的谓词没有成功的机会。您可能应该删除它,并添加另一个 mypredicate([], ..., ..., ...) 形式的子句。

    即使这样,您的谓词也只能处理满足所有条件的情况。只要您在 elementos_comuns/2 失败的列表上运行它,它就会失败。

    您要处理三种不同的情况:

    • 空列表
    • 列出[H | T],其中H满足elementos_comuns/2检查
    • 列出[H | T],其中H 不满足elementos_comuns/2 检查

    要处理三种不同情况的谓词通常应包含三个子句。

    【讨论】:

      猜你喜欢
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多