gpt4 book ai didi

prolog - 如何在 Prolog 中使用 "-"构造函数?

转载 作者:行者123 更新时间:2023-12-01 13:15:51 24 4
gpt4 key购买 nike

所以我需要创建一个 Prolog 谓词,它接受一个看起来像这样的输入 [true-X, false-Y, false-X, true-Z] 并且只返回出现的变量一次。所以对于这个例子,它会返回 [true-Z] 因为 Z 只出现一次。我已经能够用普通列表来做到这一点。

singles([],[]).

singles([H | T], L) :-
member(H, T),
delete(T, H, Y),
singles( Y, L).

singles([H | T], [H|T1]) :-
\+member(H, T),
singles(T, T1).

如果我运行它然后它返回

?- singles([1,1,2,3,4,3,3,2], R).
R = [4]

因为它只返回在列表中出现一次的值。我正在尝试做的事情的问题是我不能将 memberdelete 谓词与“-”构造函数一起使用。基本上,我必须首先将每个项目分成两部分,然后只比较变量 singles([Pol-Var | T], L)。为了比较这两个变量,我创建了一个 occurs 谓词来比较列表头部的变量。

occurs(X, [Pol-Var|T]) :- X == Var.

这是我目前所拥有的。

singles([],[]).

singles([Pol-Var | T], L) :-
occurs(Var, T),
singles(T, L).

singles([Pol-Var | T], [Pol-Var|T1]) :-
\+occurs(Var, T),
singles(T, T1).

occurs(X, [Pol-Var|T]) :- X == Var.

这基本上就像如果我有输入 [1,1,2,3,2] 那么输出将是 [1,2,3,2] 所以它只是删除彼此相邻的所有重复项。因此,如果我有输入 [true-X, false-X, false-Y, true-Y, true-Z] 那么输出将是 [false-X, true-Y , true-Z] 我希望它是 [true-Z]。我怎样才能做到这一点?

最佳答案

正如 Daniel 在他的第一条评论中指出的那样,您面临的真正问题是 Prolog 在 member/2 或 delete/3 等内置函数的参数之间执行了不需要的统一。 Prolog 社区的一个古老的trick-of-the-trade 是使用双重否定 来实现匹配而不 统一,但是我们将看,这对你帮助不大。

解决问题的更简单方法,似乎是重写 member/2 和 delete/3,所以可能是:

singles([],[]).

singles([H | T], L) :-
member_(H, T),
delete_(T, H, Y),
singles(Y, L).

singles([H | T], [H | T1]) :-
\+member_(H, T),
singles(T, T1).

member_(_-H, [_-T|_]) :- H == T, !.
member_(E, [_|R]) :- member_(E, R).

delete_([], _, []).
delete_([_-T|Ts], F-H, Rs) :- T == H, !, delete_(Ts, F-H, Rs).
delete_([T|Ts], H, [T|Rs]) :- delete_(Ts, H, Rs).

产生

?- singles([true-X, false-Y, false-X, true-Z],S).
S = [false-Y, true-Z]

您可以看到您未指定您的要求:从您的测试用例来看,我们似乎应该删除每次出现的 false-VAR 而不管 VAR...

关于prolog - 如何在 Prolog 中使用 "-"构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55154956/

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