gpt4 book ai didi

Prolog差异例程

转载 作者:行者123 更新时间:2023-12-04 23:10:29 27 4
gpt4 key购买 nike

对于我正在尝试创建的例程,我需要一些帮助。我需要制定一个看起来像这样的例程:

difference([(a,b),(a,c),(b,c),(d,e)],[(a,_)],X).

X = [(b,c),(d,e)].

我真的需要这方面的帮助..

到目前为止,我已经编写了一个方法,可以删除它找到的第一个匹配项。但是我需要它来删除所有匹配项。这是我到目前为止...
memberOf(A, [A|_]).
memberOf(A, [_|B]) :-
memberOf(A, B).

mapdiff([], _, []) :- !.
mapdiff([A|C], B, D) :-
memberOf(A, B), !,
mapdiff(C, B, D).
mapdiff([A|B], C, [A|D]) :-
mapdiff(B, C, D).

我已从列表(减法)中获取此代码。

我不完全理解它的作用,但我知道这几乎是我想要的。我没有使用减法,因为我的最终代码必须与 WIN-Prolog 兼容...我正在 SWI Prolog 上对其进行测试。

最佳答案

棘手的一个!不起眼的咖啡有正确的想法。这是一个使用双重否定的奇特解决方案:

difference([], _, []).
difference([E|Es], DL, Res) :-
\+ \+ member(E, DL), !,
difference(Es, DL, Res).
difference([E|Es], DL, [E|Res]) :-
difference(Es, DL, Res).

适用于 SWI-PROLOG。解释:

第 1 条:基本情况。没什么好争辩的!

条款 2:如果 E 在差异列表 DL 中, member/2子目标计算为 true ,但我们不想接受 member/2 的绑定(bind)如我们所愿,在任一列表中出现的变量之间产生,例如,术语 (a,_) 中的变量可以在其他术语中重复使用,并且不受第一个解决方案的约束。所以,第一个 \+删除由成功评估 member/2 创建的变量绑定(bind),第二个 \+将评估状态反转为 true , 按要求。切割发生在检查之后,不包括第 3 个子句,并丢弃了可统一的元素。

第 3 条:在两个列表中保留任何不可统一的元素。

关于Prolog差异例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1875583/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com