【问题标题】:Prolog - list contains 2x element XProlog - 列表包含 2x 元素 X
【发布时间】:2020-11-24 18:40:27
【问题描述】:

假设我们有字母 {x,y},我想创建一个函数,它返回 true 或 false,输入列表是否包含 2x 符号 x

例如two([x,x,y]). 返回true,而two([x,y,x]). 返回false

这是我目前拥有的功能:

two([Xs]) :- two(Xs, 0).
two([y|Xs], S) :- two(Xs, S).
two([x|Xs], S) :- oneX(Xs, S).
two([], S) :- S=1.

oneX([x|Xs], S) :- S1 is 1, two(Xs, M1).
oneX([y|Xs], S) :- two(Xs, S).

我使用参数 S 来确定是否已经有 2x x(如果是,则参数为 1,否则为 0)。然而,这个函数不能按预期工作,并且总是返回false。你能看出我做错了什么吗?

【问题讨论】:

  • 只有x,还是two([y, y])也足够?

标签: list prolog


【解决方案1】:

您可以在这里使用unification,从而检查您是否可以将列表的前两项与X统一,如果不能,则在列表上递归:

two([x, x|_]).
two([_|T]) :-
    two(T).

因此,第一个子句检查列表的前两项是否是两个连续的xs。第二个子句在列表的 tail 上递归,通过向列表右侧移动一步来查找另一个匹配项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-17
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    相关资源
    最近更新 更多