gpt4 book ai didi

prolog - 关于序言如何工作的误解

转载 作者:行者123 更新时间:2023-12-05 09:09:08 27 4
gpt4 key购买 nike

所以我目前正在学习序言,但我无法理解这种语言是如何工作的。“它会尝试所有可能的解决方案,直到找到一个,如果找不到,则返回 false”,这就是我读到的这种语言所做的。您只需描述解决方案,它就会为您找到解决方案

考虑到这一点,我正在尝试解决 8 皇后问题(如何在棋盘上放置 8 个皇后而不威胁其他皇后)。我有这个谓词“安全”,它获取成对列表、所有皇后的位置,并在它们不相互威胁时成功。

当我进入终端时

 ?- safe([(1,2),(3,5)]).
true ?
| ?- safe([(1,3),(1,7)]).
no
| ?- safe([(2,2),(3,3)]).
no
| ?- safe([(2,2),(3,4),(8,7)]).
true ?

它从错误的答案中识别出正确的答案,因此它知道某事是否是一个可能的解决方案

但是

当我进入

| ?- safe(L).

L = [] ? ;

L = [_] ? ;

它给了我默认答案,即使当我输入 2 个皇后时它识别出一个解决方案。

这是我的代码

threatens((_,Row),(_,Row)).
threatens((Column,_),(Column,_)).
threatens((Column1,Row1),(Column2,Row2)) :-
Diff1 is Column1 - Row1,
Diff2 is Column2 - Row2,
abs(Diff1) =:= abs(Diff2).

safe([]).
safe([_]).

safe([A,B|T]) :-
\+ threatens(A,B),
safe([A|T]),
safe(T).

我发现该问题的一个解决方案是创建谓词“position”并修改“safe”谓词

possition((0,0)).
possition((1,0)).
...
...
possition((6,7)).
possition((7,7)).

safe([A,B|T]) :-
possition(A),
possition(B),
\+ threatens(A,B),
safe([A|T]),
safe(T).

safe(L,X):-
length(L,X),
safe(L).

但这很愚蠢,因为你必须明确地输入所有内容,而且真的很慢,即使是 6 个皇后。

我真正的问题不是代码本身而是序言,我试图在序言中思考,但我读到的只是描述解决方案的外观并让它解决问题好吧,这就是我一直在做的,但它似乎不起作用,有人能给我指出一些资源,这些资源不会教你语义,而是教你如何在 prolog 中思考谢谢

最佳答案

but this is just stupid, as you have to type everything explicitly and really really slow, even for 6 queens.

关于列出位置,两个坐标是独立的,所以你可以这样写:

position((X, Y)) :-
coordinate(X),
coordinate(Y).

coordinate(1).
coordinate(2).
...
coordinate(8).

这已经大大减少了输入。如果您的 Prolog 有一个 between/3 谓词,那就更简单了:

coordinate(X) :-
between(1, 8, X).

关于谓词非常慢,这是因为你要求它做太多的重复工作:

safe([A,B|T]) :-
...
safe([A|T]),
safe(T).

一旦您知道[A|T] 是安全的,T 也必须是安全的。您可以删除最后一个目标并获得指数级的加速。

关于prolog - 关于序言如何工作的误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62643532/

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