-1

宿題の論理パズルを解くために SWI-prolog を使用する必要がありますが、プログラミングのバックグラウンドがあっても構文と意味が非常に扱いにくいと感じています。私が直面している問題は、シングルトン変数に関するエラーと、パズルが false を返すことです。

これは私がこれまでに行ったことです:

:- use_module(library(clpfd)).

sends(K,priscilla,C),
    C#\=rose.
sends(carol,L,rose).
sends(dick,L,sun).

sends(K,L,landscape).
sends(bob,rhonda,C).
sends(edna,quincy,C).

sends(K,simon,deer).
sends(K,tina,C).

solve :-
    sends(
        [alice,bob,carol,dick,edna],
        [priscilla,rhonda,quincy,simon,tina],
        [rose,heart,sun,landscape,deer]).

これが質問です。正しい方向への穏やかなナッジ、または言語をよりよく理解するのに役立つ答えをいただければ幸いです。 質問

4

1 に答える 1

2

単一使用の変数がある場合は、どこでもシングルトン エラーが発生します。これは変数の唯一の使用方法のように思われるので、多くの変数を取得することを期待しています。上記のコードは次と同等です。

sends(_,priscilla,C),
    C#\=rose.
sends(carol,_,rose).
sends(dick,_,sun).

sends(_,_,landscape).
sends(bob,rhonda,_).
sends(edna,quincy,_).

sends(_,simon,deer).
sends(_,tina,_).

に置き換えられたシングルトン変数が奇妙または間違っているように見える場合は_、ロジックが欠落していることを示す良い指標です。sends/3あなたが書いたようにへの引数は単にアトミックであるように見えることに注意してください。これにより、この呼び出しは特に奇妙になります。

sends(
    [alice,bob,carol,dick,edna],
    [priscilla,rhonda,quincy,simon,tina],
    [rose,heart,sun,landscape,deer]).

Prolog が wi​​th リストのこの使用法sends/3をアトムを使った別の呼び出しに魔法のように変換することを期待する理由はありません。あなたがここで何を期待しているのか、私にはわかりません。

これらの種類のパズルは、Prolog で非常に人気のある割り当て問題です。ここでアーカイブを検索してください。ここ数日でアーカイブがいくつかあります。インスピレーションが見つかるはずです。

于 2013-05-07T15:02:28.483 に答える