【问题标题】:Solving a Logic Puzzle in Prolog在 Prolog 中解决逻辑难题
【发布时间】:2013-10-21 21:48:51
【问题描述】:

我正在学习 Prolog,但我被这个问题困住了,我真的不知道如何完成它。我以为我的代码是对的,但我在 Sictus 中不断收到警告,我不知道我的错误在哪里。

问题来了:

/*
    File:       fall_dance_competition.pl
    Purpose:    Solve the Fall "Dance Competition" puzzle

    Notes:
    Saturday night, four couples went to the town’s annual fall dance 
    competition. Each couple dressed in matching colors and they all
    performed very well. The competition was fierce but friendly and
    everyone had a grand time. Determine the name of each couple, 
    their place in the competition, and the color each couple wore.

    1. Tom, who wasn’t married to Jean, placed better than Mary 
       and her husband but worse than the West couple did.
    2. The couple wearing brown won the event. Mr. and Mrs. 
       King came in 4th place.
    3. Bill Snow and his wife didn’t wear the green outfits. 
       Jean wasn’t married to John.
    4. The couple wearing blue placed after the couple wearing red 
       but before the King couple.
    5. From 4th place to 1st place, the couples won in the following 
       order: John and his wife, the
       couple wearing blue, Mr. and Mrs. Forest, Brenda and her husband.
    6. George and his wife placed better than Tom and Sara.
*/

这是我的代码:

use_module( library(basics)).use_module(library(lists)).

lista([pareja(_,_,_,_,_),pareja(_,_,_,_,_),
       pareja(_,_,_,_,_),pareja(_,_,_,_,_)]).

constraints( S ) :-      
    member(pareja(tom, _, _, _, _), S)
    member(pareja(_, jean, _, _, _), S)
    member(pareja(_, mary, _, _, _), S)
    member(pareja(_, _, west, _, _), S)
    perm2(Left_1, Right_1, pareja(tom, _, _, _, _), pareja(_, mary, _, _, _))
    nextto(Left_1, Right_1, S)
    perm2(Left_2, Right_2, pareja(_, _, west, _, _), pareja(tom, _, _, _, _))
    nextto(Left_2, Right_2, S)
    S = [pareja(_, _, _, 1, brown), _, _, _]
    S = [_, _, _, pareja(_, _, king, 4, _)]
    member(pareja(bill, _, snow, _, _), S)
    member(pareja(_, _, _, _, green), S)
    member(pareja(john, _, _, _, _), S)
    nextto(pareja(_, _, _, _, red), pareja(_, _, _, _, blue), S)
    nextto(pareja(_, _, _, _, blue), pareja(_, _, king, _, _), S)
    S = [_, _, _, pareja(john, _, _, 4, _)]
    S = [_, _, pareja(_, _, _, 3, blue), _]
    S = [_, pareja(_, _, forest, 2, _), _, _]
    S = [pareja(_, brenda, _, 1, _), _, _, _]   
    member(pareja(george, _, _, _, _), S)
    member(pareja(tom, sara, _, _, _), S)
    nextto(pareja(george, _, _, _, _), pareja(tom, sara, _, _, _), S).

green( Who ) :-
    lista(S),
    constraints(S),
    member(pareja(_, Who, _, _, green), S). 

nextto(X, Y, List) :- append(_, [X,Y|_], List).

append([X|Y],Z,[X|W]) :- append(Y,Z,W).  
append([],X,X).

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

perm2(X,Y, X,Y).
perm2(X,Y, Y,X).

我使用了一些斑马拼图的例子。

【问题讨论】:

  • 你忘记了逗号!成员(pareja(汤姆,_,_,_,_),S)

标签: prolog zebra-puzzle


【解决方案1】:

将程序的第一行更改为:

:- use_module(library(basics)).
:- use_module(library(lists)).

检查是否可以解决问题。 use_module/1 是一个指令,必须这样写。

【讨论】:

    【解决方案2】:

    您在constrains/1 谓词末尾不知何故遗漏了许多逗号。这会在尝试运行文件时产生很多错误。

    应该是这样的:

    constraints( S ) :-      
        member(pareja(tom, _, _, _, _), S),
        member(pareja(_, jean, _, _, _), S),
        member(pareja(_, mary, _, _, _), S),
        member(pareja(_, _, west, _, _), S),
        perm2(Left_1, Right_1, pareja(tom, _, _, _, _), pareja(_, mary, _, _, _)),
        nextto(Left_1, Right_1, S),
        perm2(Left_2, Right_2, pareja(_, _, west, _, _), pareja(tom, _, _, _, _)),
        nextto(Left_2, Right_2, S),
        S = [pareja(_, _, _, 1, brown), _, _, _],
        S = [_, _, _, pareja(_, _, king, 4, _)],
        member(pareja(bill, _, snow, _, _), S),
        member(pareja(_, _, _, _, green), S),
        member(pareja(john, _, _, _, _), S),
        nextto(pareja(_, _, _, _, red), pareja(_, _, _, _, blue), S),
        nextto(pareja(_, _, _, _, blue), pareja(_, _, king, _, _), S),
        S = [_, _, _, pareja(john, _, _, 4, _)],
        S = [_, _, pareja(_, _, _, 3, blue), _],
        S = [_, pareja(_, _, forest, 2, _), _, _],
        S = [pareja(_, brenda, _, 1, _), _, _, _],  
        member(pareja(george, _, _, _, _), S),
        member(pareja(tom, sara, _, _, _), S),
        nextto(pareja(george, _, _, _, _), pareja(tom, sara, _, _, _), S).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多