【发布时间】:2014-02-19 12:59:01
【问题描述】:
我想在 Prolog 中解决这个问题。我想给出一个自然数列表来查找列表中满足此条件的所有元素:
All elements on the left of it are smaller than it and all the elements on the right of it are larger than it.
例如给出一个列表[3,2,4,1,5,7,8,9,10,8],答案是5,7
到目前为止,我已经设法使这个函数给定列表中的一个元素,如果该元素满足上述条件,它会返回 true 或 false。
check(Elem, List) :-
seperate(Elem, List, List1, List2),
lesser(Elem, List1, X1),
bigger(Elem, List2, X2),
size(X1, L1),
size(X2, L2),
size(List, L3),
match(L1, L2, L3),
现在我想创建另一个给定列表的谓词,它对列表的每个元素进行上述计算。由于多个元素可能满足它,我想创建另一个列表,其中包含满足问题的所有元素。
问题类似于?-predicate_name([[3,2,4,1,5,7,8,9,10,8],N).,结果将是一个元素列表。
对不起,如果我没有使用正确的 Prolog 术语。我将用顺序逻辑语言更具体地描述我想做什么,尽管这样思考并不是一个好主意。如果我们将谓词检查视为给定列表和列表元素的函数,则无论元素是否满足问题的条件,它都会返回真或假。现在我想解析列表的每个元素,并为每个元素调用函数检查。如果那会返回 true,那么我会将元素添加到另一个列表中,也就是结果。我想在 Prolog 中执行此操作,但我不知道如何迭代列表。
【问题讨论】:
-
你的
check关系有三个参数,但你的check2关系用两个参数调用它。您是否希望check作为变量List2返回一个仅包含一项的列表,即Elem? -
你写的测试检查是否对所有元素都为真。你到底想要什么?不要认为在“Do this Do that”中更多地用“这意味着”来描述它
-
@alpha 我编辑了帖子,我忘记了一个论点。
-
@User 检查工作正常。我不提供任何进一步的信息,因为它的真正作用并不重要。
-
现在我想做另一个谓词,给定一个列表,它对列表中的每个元素进行上述计算。针对什么列表?你的意思是,给定一个列表,你想在该列表的每个元素上针对完整的原始列表运行
check?然后在check2中,如果有的话,你想对check的结果列表做什么?
标签: prolog