【发布时间】: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