2017-12-07 22 views
0

ここにリストを作成する必要があります。前提条件の前提条件を含む、コースの前提条件のすべての可能な組み合わせを返す必要があります。Prolog - リストを作成する

ここでは、使用する必要があるいくつかのルールと事実を紹介します(いくつかは提供していますが、私が作成したものもあります)。私はこれを達成するためにやろうとしている今、何

prereqFor(engg233, []). 
prereqFor(encm339, [engg233]). 
prereqFor(cpsc217, []). 
prereqFor(cpsc219, [cpsc217]). 
prereqFor(cpsc231, []). 
prereqFor(cpsc233, [cpsc231]). 
prereqFor(math271, [X]) :- 
    member(X, [math211, math213]). 
prereqFor(math273, []). 
prereqFor(cpsc319, [C]) :- 
    member(C, [cpsc219, cpsc233, cpsc235, encm339]). 
prereqFor(cpsc331, [M, C]) :- 
    member(M, [math271, math273]), 
    member(C, [cpsc219, cpsc233, cpsc235, encm339]). 
prereqFor(cpsc335, [C]) :- 
    member(C, [cpsc319, cpsc331]). 

は、ヘルパーそのうちの1つは2つの関数である...そして、私が使用してリストを作成するように見えることはできません[H | T]をまたは追加します...私の現在の試み:私も再帰的なケースを試みる前に、私も、最も簡単な出力を得ることができません

allPrereqFor(Course, Prerequisites) :- 
    prereqFor(Course, Prerequisites), 
    creatingList(Prerequisites, []). 

creatingList(Addition, OnGoingList) :- 
    [Addition | OnGoingList]. 

allPrereqFor(Course, Prerequisites) :- 
    prereqFor(Course, Prerequisites), 
    creatingList(Course, Prerequisites, []). 

creatingList(Course, Prerequisites, OnGoingList) :- 
    append(Course, Prerequisites, myList). 

私はまた、のようなものを試してみました。

私はすべてのprereqFor機能を列挙されていませんが、例の出力は次のようになります。

| ?- allPrereqFor(cpsc331, X). 
X = [cpsc217,cpsc219,math211,math271] ? ; 
X = [cpsc231,cpsc233,math211,math271] ? ; 
X = [consent235,cpsc235,math211,math271] ? ; 
X = [encm339,engg233,math211,math271] ? ; 

ソリューションで別の試み...

allPrereqFor(Course,[],Result) :- append([Course],[],Result). 
allPrereqFor(Course, X,Result) :- prereqFor(Course, Y), 
            Y=[H|T], 
            allPrereqFor(H,X,Result). 

トレース:

| ?- allPrereqFor(cpsc331,X). 
    1 1 Call: allPrereqFor(cpsc331,_23) ? 
    1 1 Exit: allPrereqFor(cpsc331,[]) ? 

X = [] ? ; 
    1 1 Redo: allPrereqFor(cpsc331,[]) ? 
    2 2 Call: prereqFor(cpsc331,_92) ? 
    3 3 Call: member(_78,[math271,math273]) ? 
    3 3 Exit: member(math271,[math271,math273]) ? 
    4 3 Call: member(_80,[cpsc219,cpsc233,cpsc235,encm339]) ? 
    4 3 Exit: member(cpsc219,[cpsc219,cpsc233,cpsc235,encm339]) ? 
    2 2 Exit: prereqFor(cpsc331,[math271,cpsc219]) ? 
    5 2 Call: allPrereqFor(math271,_23) ? 
    5 2 Exit: allPrereqFor(math271,[]) ? 
    1 1 Exit: allPrereqFor(cpsc331,[]) ? 

X = [] ? ; 
    1 1 Redo: allPrereqFor(cpsc331,[]) ? 
    5 2 Redo: allPrereqFor(math271,[]) ? 

私がトレースすると、再帰的にすべての適切なコースに当ることがわかりますが、 NG:

X = [] ?; 
+0

割り当てとして、自分で事実を追加するべきではないと思います。元の事実を投稿することはできますか? –

+0

「前提条件の組み合わせ」を説明する異なる方法は、「材料の構築」です。 「Prolog Bill of Materials」を検索すると、[this](http://www.amzi.com/manuals/amzi/pro/ref_dcg.htm#DCGBillMaterials)が検索されます。正確な答えではありませんが、それはあなたをボールパークに入れます。 :) –

+0

Prologを学ぶのを助けるかもしれない何かは、Prologで解決された非常に簡単な演習の例を見ることですが、別のプログラミング言語で解決さ​​れています。 [こちら](http://rosettacode.org/wiki/Category:Prolog) –

答えて

0

事前要件の事前要件を見つけることは、再帰的に行うことができます。さて、プロローグライブラリで定義されているfindall/3flatten/2を使うべきです。

pre(X,Y):- 
    preRequirement(X,Y). 


preRequirement(X,[(X-List)|Y]):- 
    findall(Z,prereqFor(X,Z),Res), 
    flatten(Res,List), 
    findPreOfPre(List,Y). 


findPreOfPre([],[]). 
findPreOfPre([H|T],[(H-L)|Result]):- 
    findall(P,prereqFor(H,P),N), 
    flatten(N,L), 
    findPreOfPre(T,Result). 
+0

動作しません。出力のみが前提条件となります。それは4 cpsc319と8 cpsc331を出力しますが、それは正しく再帰していると言います... –

+0

あなたは何を望みますか?あなたは "前提条件の前提条件"と言いました。これがこのコードの目的です。 –

+0

直接コピーして動作するかどうかを確認し、直接前提条件のみを取得します。 –

1

私が正しく、あなたの質問を理解していれば:あなたはまたは述語に基づいて、組み合わせのリストを構築するために探している

cpsc219を取る例

については

あなたは
math211math271または
math213math271

を取る必要があるだろうmath271を取るために
cpsc217cpsc219

を取る必要がありますインlinkこの例では、バイク用にbuild of materialsを使用し、実用的な質問のための資料の作成は前提条件と似ています。

この回答はDCGを使用しています。これはリストを作成しているためで、ほとんどがリストで作業するときはPrologであるためDCGが優先されます。

DCGルールはand DCGルールしか示していません。コメントに私の質問に対する答えが表示された後、or DCGルールが必要ですが、それらはバイクの例では指定されていません。だからレビューに

: プロローグ andでは ,,/2)と ;;/2)で行うことができますが、より一般的に、複数のDCGルールで行われ orで行われます。ここで述べた ,;はリスト演算子ではなく、目標を扱う演算子です。

バイクの例and drivechainのDCGルール。

drivechain --> crank, pedal, pedal, chain. 

or DCGルールの欠落している例は、複数のDCGが使用

tire --> [dunlop]. 
tire --> [goodyear]. 
tire --> [yomoto]. 

又は実装ルール使用して実装;

tire --> 
    [dunlop]; [goodyear]; [yomoto]. 

and DCG規則の実施例:

?- drivechain(X,[]). 
X = [crank, pedal, pedal, chain] ; 
false. 

or DCGルールの作業例:だから

?- tire(X,[]). 
X = [dunlop] ; 
X = [goodyear] ; 
X = [yomoto] ; 
false. 

math211またはmath213 DCG規則を必要とするmath271とあなたの問題は次のようになりために:

math211 --> [math211]. 
math213 --> [math213]. 

math271 --> math211. 
math271 --> math213. 

?- math271(X,[]). 
X = [math211] ; 
X = [math213]. 

あなたは、これが割り当てであることを指摘しているので最初の投稿では宿題を意味するようにしていますので、あなたの質問に具体的な回答はしませんが、バイクの例を使って似たようなことを教えてください。

bike --> frame, drivechain, wheel, wheel.  
wheel --> spokes, rim, hub, tire. 

tire --> [dunlop]. 
tire --> [goodyear]. 
tire --> [yomoto]. 

drivechain --> crank, pedal, pedal, chain. 

spokes --> [spokes]. 
crank --> [crank]. 
pedal --> [pedal]. 
chain --> [chain]. 
rim --> [rim]. 
hub --> [hub]. 
frame --> [frame]. 

?- bike(X,[]). 
X = [frame, crank, pedal, pedal, chain, spokes, rim, hub, dunlop, spokes, rim, hub, dunlop] ; 
X = [frame, crank, pedal, pedal, chain, spokes, rim, hub, dunlop, spokes, rim, hub, goodyear] ; 
X = [frame, crank, pedal, pedal, chain, spokes, rim, hub, dunlop, spokes, rim, hub, yomoto] ; 
X = [frame, crank, pedal, pedal, chain, spokes, rim, hub, goodyear, spokes, rim, hub, dunlop] ; 
X = [frame, crank, pedal, pedal, chain, spokes, rim, hub, goodyear, spokes, rim, hub, goodyear] ; 
X = [frame, crank, pedal, pedal, chain, spokes, rim, hub, goodyear, spokes, rim, hub, yomoto] ; 
X = [frame, crank, pedal, pedal, chain, spokes, rim, hub, yomoto, spokes, rim, hub, dunlop] ; 
X = [frame, crank, pedal, pedal, chain, spokes, rim, hub, yomoto, spokes, rim, hub, goodyear] ; 
X = [frame, crank, pedal, pedal, chain, spokes, rim, hub, yomoto, spokes, rim, hub, yomoto]. 

タイヤは、3つのブランドで構成されているにもかかわらず、タイヤと各タイヤとの二輪それぞれがあるので、9つの答えがあることに注意してくださいは、3つのブランドのいずれかになりますので、3 * 3 9

です

SWI-Prologの特定:
これらの答えの一部は...と長く、切り捨てとなりますので...せずに全体の答えを参照するには、ヘルプのために、このanswerを参照してください。言い換えれば、;falseをクエリに追加し、最初の答えの後にwを押してから、スペースバーを押して回答を追加します。

syntactic sugarのように、除外DCGルール( - >)を述語(: - )として見るには、listing/1を使用してください。

?- listing(wheel). 
wheel(A, E) :- 
     spokes(A, B), 
     rim(B, C), 
     hub(C, D), 
     tire(D, E). 
true. 

コメントに記載されているように、私は@falseがおそらくこれに答えるだろうとわかります。私は彼から学ぶので、自分の答えが自分のものよりも良いと思っていますが、誰かが私の答えに問題を見つけてそれを指摘すれば、私も学びます。

===================================

することができ、より精巧なバイクの例自転車や三輪車を作る。

bike --> type. 
type --> bicycle. 
type --> tricycle. 
bicycle --> bicycle_frame, bicycle_drivechain, wheel, wheel. 
tricycle --> tricycle_frame, tricycle_drive, wheel, wheel, wheel. 
wheel --> spokes, rim, hub, tire. 
bicycle_drivechain --> crank, pedal, pedal, chain. 
tricycle_drive --> crank, pedal, pedal. 
bicycle_frame --> [bicycle_frame]. 
tricycle_frame --> [tricycle_frame]. 
tire --> [dunlop]. 
tire --> [goodyear]. 
tire --> [yomoto]. 
spokes --> [spokes]. 
crank --> [crank]. 
pedal --> [pedal]. 
chain --> [chain]. 
rim --> [rim]. 
hub --> [hub]. 

?- bike(X,[]);false. 
X = [bicycle_frame, crank, pedal, pedal, chain, spokes, rim, hub, dunlop, spokes, rim, hub, dunlop] ; 
X = [bicycle_frame, crank, pedal, pedal, chain, spokes, rim, hub, dunlop, spokes, rim, hub, goodyear] ; 
X = [bicycle_frame, crank, pedal, pedal, chain, spokes, rim, hub, dunlop, spokes, rim, hub, yomoto] ; 
X = [bicycle_frame, crank, pedal, pedal, chain, spokes, rim, hub, goodyear, spokes, rim, hub, dunlop] ; 
X = [bicycle_frame, crank, pedal, pedal, chain, spokes, rim, hub, goodyear, spokes, rim, hub, goodyear] ; 
X = [bicycle_frame, crank, pedal, pedal, chain, spokes, rim, hub, goodyear, spokes, rim, hub, yomoto] ; 
X = [bicycle_frame, crank, pedal, pedal, chain, spokes, rim, hub, yomoto, spokes, rim, hub, dunlop] ; 
X = [bicycle_frame, crank, pedal, pedal, chain, spokes, rim, hub, yomoto, spokes, rim, hub, goodyear] ; 
X = [bicycle_frame, crank, pedal, pedal, chain, spokes, rim, hub, yomoto, spokes, rim, hub, yomoto] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, dunlop, spokes, rim, hub, dunlop, spokes, rim, hub, dunlop] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, dunlop, spokes, rim, hub, dunlop, spokes, rim, hub, goodyear] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, dunlop, spokes, rim, hub, dunlop, spokes, rim, hub, yomoto] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, dunlop, spokes, rim, hub, goodyear, spokes, rim, hub, dunlop] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, dunlop, spokes, rim, hub, goodyear, spokes, rim, hub, goodyear] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, dunlop, spokes, rim, hub, goodyear, spokes, rim, hub, yomoto] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, dunlop, spokes, rim, hub, yomoto, spokes, rim, hub, dunlop] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, dunlop, spokes, rim, hub, yomoto, spokes, rim, hub, goodyear] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, dunlop, spokes, rim, hub, yomoto, spokes, rim, hub, yomoto] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, goodyear, spokes, rim, hub, dunlop, spokes, rim, hub, dunlop] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, goodyear, spokes, rim, hub, dunlop, spokes, rim, hub, goodyear] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, goodyear, spokes, rim, hub, dunlop, spokes, rim, hub, yomoto] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, goodyear, spokes, rim, hub, goodyear, spokes, rim, hub, dunlop] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, goodyear, spokes, rim, hub, goodyear, spokes, rim, hub, goodyear] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, goodyear, spokes, rim, hub, goodyear, spokes, rim, hub, yomoto] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, goodyear, spokes, rim, hub, yomoto, spokes, rim, hub, dunlop] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, goodyear, spokes, rim, hub, yomoto, spokes, rim, hub, goodyear] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, goodyear, spokes, rim, hub, yomoto, spokes, rim, hub, yomoto] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, yomoto, spokes, rim, hub, dunlop, spokes, rim, hub, dunlop] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, yomoto, spokes, rim, hub, dunlop, spokes, rim, hub, goodyear] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, yomoto, spokes, rim, hub, dunlop, spokes, rim, hub, yomoto] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, yomoto, spokes, rim, hub, goodyear, spokes, rim, hub, dunlop] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, yomoto, spokes, rim, hub, goodyear, spokes, rim, hub, goodyear] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, yomoto, spokes, rim, hub, goodyear, spokes, rim, hub, yomoto] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, yomoto, spokes, rim, hub, yomoto, spokes, rim, hub, dunlop] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, yomoto, spokes, rim, hub, yomoto, spokes, rim, hub, goodyear] ; 
X = [tricycle_frame, crank, pedal, pedal, spokes, rim, hub, yomoto, spokes, rim, hub, yomoto, spokes, rim, hub, yomoto] ; 
false. 
+0

これまで見たことはありませんでしたが、かなり自明のようです... これはかなり手作業です。パートAで作成したすべての述語を使用することを望んでいましたが(これは割り当てに意味があります)、再帰の一部として使用されます。ロジック次... –

+0

allPrereqFor(parentCourse、X): - ...何とか... は、すべての直接PREREQSのリストを作成しますprereqFor(parentCourse、X)を使用する(ヘルパー機能付き?)再帰はすべてPREREQS渡っprereqFor(1stprereq、X)、prereqFor(2ndprereq、X)... 帰りの条件がないコースを意味する[]まで再帰を続ける... X = [prereq 、prereqs、prereqs、prereqs、prereqs、prereqs、prereqs、prereqs、prereqs) –

+0

'cpsc331'の出力を更新していただき、ありがとうございます。私の回答は必要に応じてグループ化されていません。私はそれに取り組むでしょう。 –

関連する問題