gpt4 book ai didi

list - 相邻位置的 Prolog 遍历列表

转载 作者:行者123 更新时间:2023-12-04 22:34:23 24 4
gpt4 key购买 nike

我正在编写吃 bean 人 AI(是的,这是家庭作业),但我是新手,我想找到吃 bean 人当前位置的所有相邻位置(上、下、左、右)。现在我有一个关卡中所有空闲位置的列表,但我想删除所有不与当前位置相邻的位置。这是我的相邻规则:

adjacent((X,Y), (Xx,Yy)) :-
X+1=Xx,
Y=Yy.
adjacent((X,Y), (Xx,Yy)) :-
X-1=Xx,
Y=Yy.
adjacent((X,Y), (Xx,Yy)) :-
X=Xx,
Y+1=Yy.
adjacent((X,Y), (Xx,Yy)) :-
X=Xx
Y-1=Yy.

现在我想使用位置列表 (Xx,Yy),并且只使用满足相邻规则之一的位置。所以我必须遍历列表,使用相邻(Prolog 将检查所有 4 条规则,对吗?)如果为真,则将它们添加到新列表。

像这样

    find_adjacent((X,Y),[(Xx,Yy)|T], Z] :-
adjacent((X,Y),(Xx,Yy) -> add_to_new_list((Xx,Yy),Z);

这是Prolog中正确的思维方式吗?有人能指出我正确的方向吗?

谢谢。

最佳答案

如果您在没有约束的情况下使用 Prolog,则必须先规范化/评估表达式。即:

adjacent((X,Y), (Xx,Yy)) :-
Xx is X+1,
Yy = Y.
...

会更简单更快

adjacent((X,Y), (X, Yy)) :-
( Yy is Y+1 ; Yy is Y-1 ).
adjacent((X,Y), (Xx, Y)) :-
( Xx is X+1 ; Xx is X-1).

如果第二个参数始终为基础(无变量):

adjacent((X,Y), (Xx, Yy)) :-
abs(X-XX)+abs(Y-Yy) =:= 1.

您可以考虑使用 library(clpfd),它允许您像上面的版本一样简洁地陈述所有四个规则,但仍然允许变量随处可见。

adjacent((X,Y), (Xx, Yy)) :-
abs(X-Xx)+abs(Y-Yy) #= 1.

但是,作为初学者,有更好的示例来熟悉 library(clpfd)

关于list - 相邻位置的 Prolog 遍历列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23080905/

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