🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Prolog

Prologは、非手続き型プログラミング言語です。述語論理を使った論理型言語と言われており、自然言語解析や理解、推論などのAIに有効です。エキスパートシステム開発などに用いられています。

Q&A

解決済

3回答

1060閲覧

0以下やリストの要素数以上の数を指定した時にリストをそのまま返すリスト削除関数

waribashi

総合スコア30

Prolog

Prologは、非手続き型プログラミング言語です。述語論理を使った論理型言語と言われており、自然言語解析や理解、推論などのAIに有効です。エキスパートシステム開発などに用いられています。

0グッド

0クリップ

投稿2019/07/22 02:03

前提・実現したいこと

手続き型プログラミング以外の言語も勉強するという趣旨の授業で、Prologを使ってリストの要素削除の関数を作成するという課題が出されました。
例えば

Prolog

1del(2,[a,b,c,d],L). 2L = [a, c, d] .

のように、最初に削除する要素数を指定し(リストの要素番号は0ではなく1から始まります。このリストではa=1、b=2、c=3...というようになります)、次に削除元となるリストを指定。この削除元リストから最初に指定された要素を削除します。

リストに存在する要素番号を指定した時、削除するプログラムはできたのですが、0以下の数字を指定された時やリストの要素数以上の数を指定したとき、リストをそのまま返す機能をつけたいです。
そこで「該当のソースコード」のように書いてみたのですが以下のようにfalseしか返ってきません。

Prolog

1 ?- del(0,[a,b,c,d],L). 2false.

どのように改良すればいいでしょうか。

該当のソースコード

Prolog

1del(1,[_|L],L). 2del(M,[_],_):- M=<0. 3del(N,[X|L],[X|Z]):- N>0, N1 is N-1, del(N1,L,Z).

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2019/07/22 02:07

https://teratail.com/help/avoid-asking 「学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。」 先生に聞きましょう。
waribashi

2019/07/22 02:18 編集

申し訳ございません。学校の課題に関してどこからが駄目なのか分かっておりませんでした。 確認なのですが、私の解釈として、学校の課題をそのままここに投げたり、具体的に自分がした事を書かずに目的のみを書いて解決してほしいという抽象的な質問はアウトと思っていたのですが、具体的に困っている場所を示して、試行錯誤した結果、解決できなかった質問でも、学校の課題ならば駄目なのでしょうか。
azuapricot

2019/07/22 02:23

(学校の課題ってわざわざ書かなきゃいいのにーって思いますけどね) 正直なのはいいことですが、課題って書いちゃうと大抵は学校の課題なら先生が答え知ってるんだから先生に聞きなさいって思われます。 ですが質問自体にはちゃんと努力した結果が見られるので待ってれば優しい人が回答してくれるかもしれません
gentaro

2019/07/22 02:30

そのあたりの解釈は運営に問い合わせて下さい。私は文言どおりにしか判断できません。 また、サイトの利用者としての解釈以前に、学校側がどう考えているかにもよるとは思います。 「他者の力を借りて課題を解く」ことを是としているのか否かは、外部からはわかりません。 そもそも授業料払って(有償で)教育を受ける権利(サポートしてもらう権利)を買っているのに、無償の質問サイトでわざわざ質問する意味がちょっとよくわかりませんけど。
waribashi

2019/07/22 02:31

なるほど。前まで書いてなかったのですが前に一度、何でこんな意味無さそうな事をしてるのかと訊かれてから書いた方がいいのかと思い、それから書いていました。 ご親切にありがとうございます。
waribashi

2019/07/22 02:43 編集

gentaro様 些細な質問なら学校でするのですが、以前、これが分かれば課題の半分は終わったも同然みたいな質問したところ「それを考えるのが貴方の仕事でしょ」と答えてくれなかったことがあり、それから課題に深くかかわる質問は学校外でするようになっていました。でもそれを言ったのは今回課題を出した先生と違う方なので、一度聞いてみます。ありがとうございました。
azuapricot

2019/07/22 02:55

聞き方が悪かったのかもしれませんが、「それを考えるのがあなたの仕事でしょ」と講師が言ったのだとすれば、「それを教えるのがあなたの仕事でしょ」と講師に特大ブーメラン返してやりたいですね。 ですが全員に答えを教えてしまっては講師も課題を出す意味がなくなってしまうので、 質問スキルを磨く必要がありますね 「ここがわかりません」じゃなくて、「こうやってみたのですが、こういう動きになってしまって・・・本当はこういう風になる想定だったのですが助けていただけませんか」みたいな() 先生だって人間なので困ってる人間をただ見捨てたりはしないし、持ち上げられればおおそうかそうかと機嫌がよくなって答えてくれるかもしれません。
mather

2019/07/22 03:15

> 些細な質問なら学校でするのですが、 些細な質問でなくても、授業で学んでいる以上は担当の講師や同じ授業を受けている人に質問しましょう。 オンラインでの質問は基本的に断片的な情報しかなく、意図をきちんと説明して解説してくれる方が有意義です。 > 以前、これが分かれば課題の半分は終わったも同然みたいな質問したところ「それを考えるのが貴方の仕事でしょ」と答えてくれなかったことがあり ここのところの線引きは難しいかもしれないですが、聞かれたとおりに講師が全て解いてしまったら勉強にならないですよね。「必要なヒントは十分出したのであとは自分で解かないと意味がない」と突っぱねられたとしても多少冷たく感じるかもしれませんが必要な教育だと思います。 しばらく考えてみてやっぱりわからないときは、わからないポイントを整理してから再度質問しましょう。同じことを何度も聞かれると教える側もだんだん辛くなってきます。
Zuishin

2019/07/22 04:32

それを考えるのがあなたの仕事と言われたなら、人にやらせず自分で考えなきゃいけないのでは?
Zuishin

2019/07/22 04:51

基本的に、教師が生徒にできない課題を出すことはありません。 出たとすれば、それはあなたができるふりをしているからです。具体的に言えば、今までの課題を他人に解いてもらって、自分でやったことにして提出するなどです。 あなたはできないときには「できない」と伝えなければいけません。そうすれば教育内容が変わります。他の生徒ができる場合にはあなただけ補修という形になるかもしれませんが。
waribashi

2019/07/22 05:39

見ていない間に返信が一気に増えたのでまとめて回答させていただきます。 様々なアドバイスありがとうございます。参考にさせていただきます。
guest

回答3

0

これを よみましょう。
学校の課題を解いてほしい等の質問は、
具体的にプログラミングで困っている質問ではないと考え、
推奨していません。

投稿2019/07/23 06:35

nanami12

総合スコア1015

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

直接の回答ではないですが…。

prolog

1del(1,[_|L],L).

[_|L]L はリストの最初の要素を除く残りの部分とマッチしますよね。

prolog

1del(M,[_],_):- M=<0.

ではこちらでは [_] はどんなときにマッチしますか?
もし変数名を入れて del(M,[L],L):- M=<0. と書いた場合はどんな宣言を意味するものになるでしょうか?

投稿2019/07/22 06:25

mather

総合スコア6759

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

0以下の数字を指定された時やリストの要素数以上の数を指定したとき

の判定を行い、そう判定されれば、「リストをそのまま返す」動作をするコードを書けばいいです

投稿2019/07/22 04:03

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

waribashi

2019/07/22 05:40

回答ありがとうございます。頑張ってみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問