为什么这个 prolog 函数会无限期运行,我该如何解决?

问题描述 投票:0回答:0

我正在尝试创建一个序言谓词来解决这个斑马问题,但是它会无限期地运行并且不会产生结果,我该如何解决这个问题。

这是斑马问题:

世界五大DJ将在电子音乐节上表演,每一个 一个在特定阶段。他们并排等待玩耍。找出他们的国籍、爱好和他们玩的类型。

DJ属性:

  • 球衣颜色:黑色、蓝色、绿色、红色、白色

  • 国籍:美国、加拿大、荷兰、法国、苏格兰

  • 音乐类型:鼓和贝司、dubstep、EDM、house、trance

  • 演出舞台:世外桃源、仙宫、香格里拉、瓦尔哈拉、西巴尔巴

  • 年龄:25、30、35、40、45

  • 爱好:露营、杂耍、绘画、唱歌、冲浪

线索

  • Scott 在身穿白色衬衫的 DJ 左侧某处。

  • 第四位是要在Arcadia上演奏的DJ 阶段。

  • 30岁的DJ第一位

  • 放EDM的DJ就在加拿大人的右边

  • 喜欢绘画的人在玩Dubstep的DJ旁边

  • 身穿黑色衬衫的 DJ 介于 Scott 和 Dubstep 播放器,按此顺序。

  • 法国DJ在身穿蓝色衬衫的旁边。

  • 其中一端是喜欢Camping的DJ

  • 即将在仙宫舞台上表演的DJ穿着蓝色 衬衫。

  • 喜欢画画的介于穿绿色的DJ之间 和穿着蓝色的 DJ,按顺序排列。

  • 第五位是打鼓和贝司的DJ

  • 中间是要上仙宫舞台的DJ

  • 弹Trance的在弹Dubstep的旁边

  • 喜欢杂耍的DJ正好在左边的加拿大人

  • 爱好唱歌的DJ就在DJ的右边 穿着黑色衬衫。

  • 三十多岁的DJ旁边是玩杂耍的DJ

  • 第四位是40岁的DJ

  • 这位40岁的DJ介于荷兰人和最年轻的DJ之间,在那 订单。

  • 穿蓝色衣服的 DJ 在要播放的 DJ 的左边某处 西巴尔巴舞台

  • 喜欢冲浪的人要去英灵殿舞台上玩

  • 穿红色衬衫的 DJ 在法国人右边的某个地方

到目前为止,这是我的代码:

member(X, [X|_]).
member(X, [_|T]) :- member(X, T).

left_of(A, B, L) :- append(_, [A|T], L), member(B, T).

next_to(A, B, L) :- left_of(A, B, L) ; left_of(B, A, L).

solve(DJs) :-
    DJs = [_, _, _, _, _],

    % Clue 1
    member([scott, _, _, _, _, _], DJs),
    member([_, white, _, _, _, _], DJs),
    left_of([scott, _, _, _, _, _], [_, white, _, _, _, _], DJs),

    % Clue 2
    DJs = [_, _, _, [_, _, _, arcadia, _, _], _],

    % Clue 3
    DJs = [[_, _, _, _, 30, _], _, _, _, _],

    % Clue 4
    member([canadian, _, _, _, _, _], DJs),
    member([_, _, edm, _, _, _], DJs),
    left_of([canadian, _, _, _, _, _], [_, _, edm, _, _, _], DJs),

    % Clue 5
    next_to([_, _, _, _, _, painting], [_, _, dubstep, _, _, _], DJs),

    % Clue 6
    left_of([scott, _, _, _, _, _], [_, black, _, _, _, _], DJs),
    left_of([_, black, _, _, _, _], [_, _, dubstep, _, _, _], DJs),

    % Clue 7
    next_to([french, _, _, _, _, _], [_, blue, _, _, _, _], DJs),

    % Clue 8
    (DJs = [[_, _, _, _, _, camping], _, _, _, _] ; DJs = [_, _, _, _, [_, _, _, _, _, camping]]),

    % Clue 9
    member([_, blue, _, asgard, _, _], DJs),

    % Clue 10
    left_of([_, green, _, _, _, _], [_, _, _, _, _, painting], DJs),
    left_of([_, _, _, _, _, painting], [_, blue, _, _, _, _], DJs),

    % Clue 11
    DJs = [_, _, _, [_, _, _, _, 40, _], _],

    % Clue 12
    next_to([_, _, trance, _, _, _], [_, _, dubstep, _, _, _], DJs),

    % Clue 13
    left_of([canadian, _, _, _, _, _], [_, _, _, _, _, juggling], DJs),

    % Clue 14
    left_of([_, black, _, _, _, _], [_, _, _, _, _, singing], DJs),

    % Clue 15
    next_to([_, _, _, _, 35, _], [_, _, _, _, _, juggling], DJs),

    % Clue 16
    left_of([dutch, _, _, _, _, _], [_, _, _, _, 25, _], DJs),
    left_of([_, _, _, _, 25, _], [_, _, _, _, 40, _], DJs),

    % Clue 17
    left_of([_, blue, _, _, _, _], [_, _, _, xibalba, _, _], DJs),

    % Clue 18
    member([_, _, _, valhalla, _, surfing],DJs),

    % Clue 19
    member([_, red, _, _, _, _], DJs),
    left_of([french, _, _, _, _, _], [_, red, _, _, _, _], DJs),

    % Check properties
    member([american, _, _, _, _, _], DJs),
    member([canadian, _, _, _, _, _], DJs),
    member([dutch, _, _, _, _, _], DJs),
    member([french, _, _, _, _, _], DJs),
    member([scottish, _, _, _, _, _], DJs),

    member([_, black, _, _, _, _], DJs),
    member([_, blue, _, _, _, _], DJs),
    member([_, green, _, _, _, _], DJs),
    member([_, red, _, _, _, _], DJs),
    member([_, white, _, _, _, _], DJs),

    member([_, _, drum_and_bass, _, _, _], DJs),
    member([_, _, dubstep, _, _, _], DJs),
    member([_, _, edm, _, _, _], DJs),
    member([_, _, house, _, _, _], DJs),
    member([_, _, trance, _, _, _], DJs),

    member([_, _, _, arcadia, _, _], DJs),
    member([_, _, _, asgard, _, _], DJs),
    member([_, _, _, shangri_la, _, _], DJs),
    member([_, _, _, valhalla, _, _], DJs),
    member([_, _, _, xibalba, _, _], DJs),

    member([_, _, _, _, 25, _], DJs),
    member([_, _, _, _, 30, _], DJs),
    member([_, _, _, _, 35, _], DJs),
    member([_, _, _, _, 40, _], DJs),
    member([_, _, _, _, 45, _], DJs),

    member([_, _, _, _, _, camping], DJs),
    member([_, _, _, _, _, juggling], DJs),
    member([_, _, _, _, _, painting], DJs),
    member([_, _, _, _, _, singing], DJs),
    member([_, _, _, _, _, surfing], DJs).
optimization prolog swi-prolog zebra-puzzle
© www.soinside.com 2019 - 2024. All rights reserved.