- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我需要创建一个 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]
因为它只返回在列表中出现一次的值。我正在尝试做的事情的问题是我不能将 member
或 delete
谓词与“-”构造函数一起使用。基本上,我必须首先将每个项目分成两部分,然后只比较变量 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/
我是一名优秀的程序员,十分优秀!