gpt4 book ai didi

prolog - 确定逻辑程序

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

目标是实现谓词noDupl/2

该谓词的第一个参数是要分析的列表,第二个参数是不重复的数字列表。

我无法理解下面的代码,当我编译它时,它给出了一条错误消息,指出 contained is undefined procedure,但是作为提示,我们可以将其用作预定义谓词 包含notContained。我想我需要定义 containednotContained

noDupl(XS, Res):-
help( XS, [],Res).

help([],_,[]).
help([X|XS],Seen,[X|Res]):-
notContained(X,XS),
notContained(X,Seen),
help(XS, [X|Seen], Res).
help([X|XS],Seen,Res):-
contained(X,Seen),
help(XS, Seen, Res).
help([X|XS],Seen,Res):-
contained(X,XS),
help(XS, [X|Seen], Res).

谁能给我解释一下这个问题。

最佳答案

缺少的定义可能是:

contained(X,[X|_]).
contained(X,[E|Es]) :-
dif(X, E),
contained(X, Es).

notContained(_X, []).
notContained(X, [E|Es]) :-
dif(X, E),
notContained(X, Es).

(我喜欢称这些关系为 memberd/2non_member/2。)

您给出的定义扩展了关系,为目前考虑的元素添加了一个额外的参数。

要理解每个子句的含义,请按箭头方向从右到左阅读每个子句(:- 是 1970 年代 的 ASCII 化).让我们采用第一条规则:

Provided, that X is not an element of XS, and
provided, that X is not an element of Seen, and
provided, that help(X, [X|Seen], Res) is true,


then also help([X|XS],Seen,[X|Res]) is true.

换句话说,如果X既不在已访问元素列表Seen中,也不在尚未访问的元素XS中,那么它没有副本。

有点难以理解的是你给出的子句是否相互排斥 - 严格来说,这不是你关心的,只要你只对声明性属性感兴趣,但最好避免此类冗余。

这是一个案例,其中显示了这种冗余:

?- noDupl([a,a,a],U).
U = []
; U = []
; false.

理想情况下,系统会给出一个确定的答案:

?- noDupl([a,a,a], U).
U = [].

就我个人而言,我不太喜欢把事情分成太多的情况。本质上,我们可以有两个:一个是重复的,一个不是。

有可能提供一个正确的定义,并且对于确定性可能存在的情况仍然完全确定 - 例如当第一个参数“充分实例化”(包括基本列表)时。让我们看看这个方向是否有一些答案。

关于prolog - 确定逻辑程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31368185/

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