gpt4 book ai didi

prolog - 我怎样才能让这个更有逻辑性?

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

我试图解决 chapter 6's exercises on LPN! 中的以下问题:

Write a predicate set(InList,OutList) which takes as input an arbitrary list, and returns a list in which each element of the input list appears only once. For example, the query

set([2,2,foo,1,foo, [],[]],X).

should yield the result

X = [2,foo,1,[]].

我做到了:

set_([], [], []).
set_([H|Bag], [H|Set], Dups):-
set_(Bag, Set, Dups),
\+ member(H, Set),
\+ member(H, Dups).
set_([H|Bag], Set, [H|Dups]):-
set_(Bag, Set, Dups),
member(H, Set).

set(Bag, Set, Rest):-
reverse(BagR, Bag),
set_(BagR, SetR, RestR),
reverse(SetR, Set),
reverse(RestR, Rest).

set(Bag, Set):- set(Bag, Set, _).

但我对需要这 3 个 reverse/2 并不感兴趣。有人能帮我找到一个更优雅的解决方案吗?

我首先尝试做一个右递归解决方案,但在试图证明问题可以“继续”时会陷入困境。例如,如果我调用 set_([1,2,1], L, R),它会在证明 set(_, [1,2|_], [1 |_])。。如果您对如何避免这种情况有任何反馈,请告诉我!

编辑 1:我最终使用了foldl/4:

pushForward(X, [Set0, Rest], [Set, Rest]):-
\+ member(X, Set0),
append([Set0, [X]], Set).
pushForward(X, [Set, Rest0], [Set, Rest]):-
member(X, Set),
append([Rest0, [X]], Rest).

set(Bag, Set, Rest):- foldl(pushForward, Bag, [[],[]], [Set, Rest]).

set(Bag, Set):- set(Bag, Set, _).

然而,这并没有真正触及问题的核心。我希望能够指定模型的关系,并询问“什么适合这些孔”。这个解决方案的作用恰恰相反——它需要一些值并修改它们,直到我们无事可做——而这应该是 Prolog 的工作,而不是我的。 ;)

最佳答案

这个名字不太理想。使用库(reif):

list_nub([], []).
list_nub([E|Es], [E|Gs]) :-
tfilter(dif(E), Es, Fs),
list_nub(Fs, Gs).

?- Xs = [_,_,_], Ys = [_,_], list_nub(Xs, Ys).
Xs = [_A,_A,_B], Ys = [_A,_B], dif(_A,_B)
; Xs = [_A,_B,_A], Ys = [_A,_B], dif(_A,_B)
; Xs = [_A,_B,_B], Ys = [_A,_B], dif(_A,_B)
; false.
?- Xs = [_,_,_], Ys = [_], list_nub(Xs, Ys).
Xs = [_A,_A,_A], Ys = [_A]
; false.
?- Xs = [_,_,_], Ys = [_,_,_], list_nub(Xs, Ys).
Xs = [_A,_B,_C], Ys = [_A,_B,_C], dif(_A,_B), dif(_A,_C), dif(_B,_C).
?- dif(A,B), Xs = [A|_], Ys = [B|_], list_nub(Xs, Ys).
false.

关于prolog - 我怎样才能让这个更有逻辑性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61700101/

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