【问题标题】:Prolog add elementsProlog 添加元素
【发布时间】:2018-06-10 18:29:45
【问题描述】:

我的问题是:

编写一个 Prolog 程序,给定两个列表 L1 和 L2 , 输出 两个新列表 L3 和 L4 使得 L3 包含以下元素 L1 也属于 L2 ,而 L4 包含元素 不属于 L2 的 L1 .您可以使用内置 谓词成员。 例如,查询 listmem([a, r, t], [t, s, m, n, a], L3, L4) 产生 L3 = [a, t] 和 L4 = [r]。

我现在的解决方案是:

memberOf([], [], _).
memberOf([H|T], L2, [X|Xs]) :-
   X is H,
   member(X, L2),
   memberOf(T, L2, Xs).

但是当我对以下输入进行测试时,它返回 no..

memberOf( [1,2,3], [2,3,4], L3 ).

我做错了什么?

【问题讨论】:

  • 请勿在此处使用is/2,因为它用于算术表达式求值。 is/2 将碰巧以这种方式处理数字,但不适用于原子。使用统一=/2。但是,这里发生的情况是,就您得到“否”的原因而言,您的递归继续将第一个参数列表减少到[],但第二个参数永远不会减少到[]。所以你的基本情况永远不会匹配,并且最终,因为第一个参数变成 [] 并且不匹配第二个子句。

标签: prolog


【解决方案1】:
listmem(L1,[],[],L1).
listmem([],_,[],[]).
listmem([H1|T1],L2,[H1|L3],L4):-
    member(H1,L2), !,
    listmem(T1,L2,L3,L4). 
listmem([H1|T1],L2,L3,[H1|L4]):-
    listmem(T1,L2,L3,L4).    

我在第三种情况下添加了一个剪辑,而不是在最后一种情况下添加了\+ member(H1,L2),因此您可以使用“其他方式”的listmem,例如,而不是:

?- listmem([a, r, t], [t, s, m, n, a], L3, L4).
L3 = [a, t],
L4 = [r].

您还可以:

?- listmem([a, r, t], L2, [a,t], L4).
L2 = [a, t|_G10554000],
L4 = [r].

【讨论】:

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