【问题标题】:Prolog: Find even numbers add them on a listProlog:查找偶数将它们添加到列表中
【发布时间】:2017-03-26 18:53:04
【问题描述】:

写谓词evenNumbers(L1, L2),如果列表L1为真 包含随机整数,列表L2 包含来自L1 的偶数整数。

例如:

?-evenNumbers ([2,1,-3,6,8,9], L2). 

»您的程序返回L2 = [2,6,8].

我的代码是:

    evenNumbers([],[]).
    evenNumbers([H|T],L):-
        integer(H),
        0 is H mod 2,
        append([H],L,L);
        evenNumbers(T,L).

【问题讨论】:

  • 我认为它有问题,但你没有解释什么。
  • 问题出在这一行:append([H],L,L);但我不知道如何在没有附加的情况下解决它。
  • 我以前看过那些答案,但我刚开始学习序言。所以这不是那么容易弄清楚的!
  • 使用您接受的解决方案,请简单尝试最一般的查询:“到底有哪些解决方案?”我们可以问:?- evenNumbers(Ls, Es).,然后我们获得,作为唯一解决方案:Ls = Es, Es = []。当然这不可能是正确的,不是吗?请考虑一下您实际期望从 Prolog 程序中获得的属性。例如,在最一般的情况下,如果程序回答一系列所有可能的解决方案而不是只给出其中一个解决方案,那就太好了。让我们希望也能发布更好的答案。考虑稍等片刻,研究不同的方法。

标签: list prolog append


【解决方案1】:

你的代码有多个问题append([H],L,L); 将停止递归并给你一个错误的列表,你的 if-then-else 语句也不正确。所以你可以写:

 evenNumbers([],[]).
 evenNumbers([H|T],L1):-
        integer(H),
        (H mod 2 =:=0 -> L1=[H|T1],evenNumbers(T,T1);
        evenNumbers(T,L1) ).

例子:

?- evenNumbers([2,1,-3,6,8,9], L2).
L2 = [2, 6, 8].

另一种写法是:

evenNumbers(L1,L2):-findall(X,(member(X,L1), X mod 2=:=0),L2).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2016-02-11
    • 2021-09-28
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多