gpt4 book ai didi

prolog - 在列表中查找唯一项

转载 作者:行者123 更新时间:2023-12-01 07:53:01 26 4
gpt4 key购买 nike

我正在尝试编写一个规则来决定一个项目是否X恰好在列表中出现一个 L .

unique(X, [X|T]):- !, \+ member(X, T).
unique(X, [_|T]):- unique(X, T).

该规则适用于确定一个值在列表中是否唯一,但是当我尝试使用 unique(X, [1,2,3,1,3,2,5,4,3,8]). 在列表中获取唯一值时它只返回 false.我期望的是这个(比如 member(X, list). :
X = 5 ;
X = 4 ;
X = 8 ;

我是一个完整的初学者,我不知道我做错了什么。

最佳答案

你一直在使用 cut 和一种不安全的否定形式。两者都必须非常小心地使用。一个直接的解决方法是保护你的程序免受它不是设计用于的用途:

unique(X, Xs) :-
iwhen(ground(X+Xs), your_unique(X, Xs)).

这使用 iwhen/2类似于 when/2除了它不会延迟:
:- meta_predicate iwhen(+, 0).

iwhen(Cond, G_0) :-
when(Cond, ( Called = true, G_0 ) ),
( var(Called) -> throw(error(instantiation_error,_)) ; true ).

以上适用于提供 when/2 的系统.以下是任何符合 ISO 标准的系统:
iwhen(Cond, G_0) :-
( when_condition(Cond)
-> ( Cond -> G_0 ; throw(error(instantiation_error,_)) )
; throw(error(domain_error(when_condition, Cond),_))
).

when_condition(C) :-
var(C),
!,
throw(error(instantiation_error,_)).
when_condition(ground(_)).
when_condition(nonvar(_)).
when_condition(?=(_, _)).
when_condition(( A, B )) :-
when_condition(A),
when_condition(B).
when_condition(( A ; B )) :-
when_condition(A),
when_condition(B).

另一方面,总是收到实例化错误而不是真正的答案会让人非常沮丧。所以,让我们让你的程序真正纯粹!

你的第二条规则
unique(X, [_|Es]) :-
unique(X, Es).

声明式地从右到左读取(即 :- 是一个 )

Provided X is a unique element of the list Es, then X is a unique element of the list [_|Es].



换句话说:每当我知道 XEs 中是独一无二的,它也将是独一无二的 任何 Es 中的进一步元素.该结论不正确,考虑将列表扩展 X !你需要一些额外的条件。此外,您的第一条规则需要重新制定。这使用 non_member/2 :
unique(X, [X|Es]) :-
non_member(X, Es).
unique(X, [E|Es]) :-
dif(X, E),
unique(X, Es).

这是使用 tfilter/3 的另一种方法:
unique(X, Es) :-
tfilter(=(X), Es, [_]).

最有效的可能是以下使用 if_/3library(reif) :
unique(X, [E|Es]) :-
if_(X = E, non_member(E, Es), unique(X, Es) ).

关于prolog - 在列表中查找唯一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40447534/

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