在prolog中实现crossroads逻辑

在prolog中实现crossroads逻辑,prolog,Prolog,我想写一个程序,检查一辆车是否可以在十字路口行驶/转弯。 汽车通过颜色(如蓝色、灰色、红色)进行识别,汽车的位置由指南针方向(北、东、南、西)确定。 检查是否允许驾驶的功能是allow(颜色)。(例如allow(蓝色)。) 这是我的实际代码: % crossroads priority check % define cars, positions, and directions % carPosition(Color, Position, Direction). % Case A carP

我想写一个程序,检查一辆车是否可以在十字路口行驶/转弯。 汽车通过颜色(如蓝色、灰色、红色)进行识别,汽车的位置由指南针方向(北、东、南、西)确定。 检查是否允许驾驶的功能是
allow(颜色)。
(例如
allow(蓝色)。

这是我的实际代码:

% crossroads priority check

% define cars, positions, and directions 
% carPosition(Color, Position, Direction).

% Case A
carPosition(blue, north, right).
carPosition(red, east, straight).
carPosition(grey, west, left).

% define right and straight neighbours
% neighbours(Position, RightNeighbour, StraightNeighbour).
neighbours(north, west, south).
neighbours(west, south, east).
neighbours(south, east, north).
neighbours(east, north, west).

% check if turn is allowed
allowed(Color) :-

% Check right turns
    carPosition(Color, _, right);

% Check left turns
    (carPosition(Color, Position, left),
    neighbours(Position, RightNeighbour, StraightNeighbour),
    aggregate_all(count, carPosition(_, StraightNeighbour, _), CountStraight),
    aggregate_all(count, carPosition(_, RightNeighbour, _), CountRight),
    (CountStraight + CountRight) < 1 );

% Check straight turns
    (carPosition(Color, Position, straight),
    neighbours(Position, RightNeighbour, _),
    aggregate_all(count, carPosition(_, RightNeighbour, _), CountRight),
    (CountRight < 1 )).
%crossroads优先级检查
%定义车辆、位置和方向
%位置(颜色、位置、方向)。
%案例A
车位(蓝色,北,右)。
果皮位置(红色、东、直)。
果皮位置(灰色、西、左)。
%定义右邻域和直邻域
%邻居(位置、右邻居、直邻居)。
邻国(北、西、南)。
邻国(西、南、东)。
邻国(南、东、北)。
邻国(东、北、西)。
%检查是否允许转弯
允许(颜色):-
%检查右转
腕位(颜色,右);
%检查左转
(位置(颜色、位置、左侧),
邻居(位置、右邻居、直邻居),
合计所有(计数、carPosition(u、直线相邻、u)、计数直线),
聚合所有(计数,位置(u,右邻接,u),计数右),
(CountRight+CountRight)<1);
%检查直转弯
(位置(颜色、位置、直线),
邻居(位置,右邻居,u),
聚合所有(计数,位置(u,右邻接,u),计数右),
(CountRight<1)。
在本例(案例A)中,
allow(红色)。
allow(灰色)。
的答案与预期一致

但是
allow(蓝色)。
返回:

是的


这个错误是从哪里来的?如何避免它?

你的评论几乎暗示了这个问题。如果一辆汽车可以向右行驶、向左行驶或笔直行驶,那么你将其定义为“欠债”

allow(红色)
allow(灰色)
的情况下,所有这些选项都被选中,它们都是错误的,因此会立即打印false

allow(blue)
的情况下,首先选中第一个选项,它的计算结果为true,然后打印。但是,这次Prolog知道还有一些选项尚未检查,并等待您请求进一步计算

Prolog然后检查后两个选项,这两个选项的计算结果为false,因为蓝色汽车既不想向左行驶,也不想直行

由于Prolog无法知道每辆车只有一个方向的愿望,因此它无法在第一个结果后中止计算,因为在其他情况下,需要额外的解决方案

有两种简单的方法可以解决此问题:

  • 在每个选项之后使用。请注意,这可能会改变语义(比较链接中的红色和绿色切割)。在你的例子中,它是一个红色切割,因为它改变了语义

    % Check right turns carPosition(Color, _, right),!; % Check left turns (carPosition(Color, Position, left),!,…

PS:您的程序中似乎有snytax错误。我不得不删除第一个
允许的
目标中的括号。

错误的选择点?可能是我理解prolog的一个普遍问题。但是如何使它更好/正确?很好,非常感谢您的详细解释。对于这个太多的括号,我感到非常抱歉。我想这是一种原因,但我对prolog是新手。现在如果我使用´´´´´´´allow(Color)。´´´它适用于每种情况。但是在我使用´´´´´allow(X)´´´的情况下,有不止一辆车被允许驾驶,当然它会在第一种颜色之后停止。但要纠正这一点,我认为需要一种完全不同的逻辑。正确吗?我不会更改逻辑,而是让用户决定(在查询中或在另一个谓词中)。通过这种方式,您可以为校对和统一提供相同的谓词。再次感谢。听起来很有逻辑,因为我睡了一夜。 allowed(blue),!.