1
1
Fork 0

feat(prolog): wedding woes

Signed-off-by: Christina Sørensen <christina@cafkafk.com>
This commit is contained in:
Christina Sørensen 2024-12-22 16:42:31 +01:00
parent 2b2c2ba396
commit 9ffc70cd57
Signed by: cafkafk
GPG key ID: 26C542FD97F965CE
7 changed files with 308 additions and 0 deletions

View file

@ -0,0 +1,17 @@
{
"authors": [
"erikschierboom"
],
"files": {
"solution": [
"wedding_woes.pl"
],
"test": [
"wedding_woes_tests.plt"
],
"example": [
".meta/wedding_woes.example.pl"
]
},
"blurb": "Infer family relations from some basic facts."
}

View file

@ -0,0 +1 @@
{"track":"prolog","exercise":"wedding-woes","id":"ee9221fad24f42b1be3fe4fc1eb096f5","url":"https://exercism.org/tracks/prolog/exercises/wedding-woes","handle":"cafkafk","is_requester":true,"auto_approve":false}

View file

@ -0,0 +1,84 @@
# Help
## Running the tests
## Command line
The following command can be used to run the tests from the command line:
```bash
swipl -f <exercise>.pl -s <exercise>_tests.plt -g run_tests,halt -t 'halt(1)'
```
Replace `<exercise>` with the name of the exercise you are implementing.
## Interactive
To run prolog interactively first run:
```bash
swipl
```
After the prolog console starts, load your implementation and run the tests
with:
```
?- ["<exercise>.pl"].
?- ["<exercise>_tests.plt"].
?- run_tests.
```
Replace `<exercise>` with the name of the exercise you are implementing.
### Reloading changes
Once the above files are loaded, you can apply any changes you've made
by running:
```
?- make.
```
## Skipped tests
When you first begin an exercise, only the first test will run. The rest have
been skipped by adding `condition(pending)` to the `test` goal. Once the first
test passes, un-skip the next test by changing `pending` in `condition(pending)`
to `true`. Repeat for each test until they are all running and passing.
### Command line
Add the `-- --all` argument to the end of the command to also run any pending tests:
```bash
swipl -f <exercise>.pl -s <exercise>_tests.plt -g run_tests,halt -t 'halt(1)' -- --all
```
## Submitting your solution
You can submit your solution using the `exercism submit wedding_woes.pl` command.
This command will upload your solution to the Exercism website and print the solution page's URL.
It's possible to submit an incomplete solution which allows you to:
- See how others have completed the exercise
- Request help from a mentor
## Need to get help?
If you'd like help solving the exercise, check the following pages:
- The [Prolog track's documentation](https://exercism.org/docs/tracks/prolog)
- The [Prolog track's programming category on the forum](https://forum.exercism.org/c/programming/prolog)
- [Exercism's programming category on the forum](https://forum.exercism.org/c/programming/5)
- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs)
Should those resources not suffice, you could submit your (incomplete) solution to request mentoring.
To get help if you're having trouble, you can use one of the following resources:
- [SWI Prolog Documentation](http://www.swi-prolog.org)
- [Tutorials and Resources](http://www.swi-prolog.org/Links.html)
- [/r/prolog](https://www.reddit.com/r/prolog) is the Prolog subreddit.
- [StackOverflow](http://stackoverflow.com/questions/tagged/prolog) can be used to search for your problem and see if it has been answered already. You can also ask and answer questions.

View file

@ -0,0 +1,33 @@
# Hints
## General
- The [Prolog basics page](https://www.tutorialspoint.com/prolog/prolog_basics.htm) explains what facts and rules are and how to define them
## 1. List the chatty people
- You're defining a [fact](https://www.tutorialspoint.com/prolog/prolog_basics.htm)
- You can define multiple "instances" of the same fact
- Remember to use lowercase names
## 2. List who likes whom
- You're defining a [fact](https://www.tutorialspoint.com/prolog/prolog_basics.htm)
- You can define multiple "instances" of the same fact
- Remember to use lowercase names
- The first argument is the person liking the other person
- The second argument is the person being liked by the other person
## 3. People who like each other make a good pairing
- You're defining a [rule](https://www.tutorialspoint.com/prolog/prolog_basics.htm)
- In Prolog, making sure that two facts/rules are both true is done via a [conjunction](https://www.tutorialspoint.com/prolog/prolog_conjunctions_and_disjunctions.htm)
## 4. Chatty people pair with anyone
- You're defining a [rule](https://www.tutorialspoint.com/prolog/prolog_basics.htm)
- In Prolog, making sure that at least one of two facts/rules is true is done via a [disjunction](https://www.tutorialspoint.com/prolog/prolog_conjunctions_and_disjunctions.htm)
## 5. Check seating arrangement
- You're defining a [rule](https://www.tutorialspoint.com/prolog/prolog_basics.htm)

View file

@ -0,0 +1,105 @@
# Wedding Woes
Welcome to Wedding Woes on Exercism's Prolog Track.
If you need help running the tests or submitting your code, check out `HELP.md`.
If you get stuck on the exercise, check out `HINTS.md`, but try and solve it without using those first :)
## Introduction
Your best friend is getting married and asked you to be their wedding planner.
You agreed, though everything you know about it is from a movie...
Things were going smoothly, until you started working on the table seating.
Five guests will be attending, seated around one big, round table.
Here's the guest list:
- Esteban, Gustavo, Jaime, Malena, and Valeria.
Your goal is to find a seating arrangement where everyone is happy with their neighbors.
You don't know everyone quite as well as you'd like, but here's what you do know:
- Gustavo is chatty
- Valeria is chatty
- Esteban likes Malena
- Malena likes Esteban
- Gustavo likes Valeria (but not vice versa!)
People who like each other can be seated next to each other, but only when they both feel that way.
Chatty people intermingle easily and can be seated next to anyone.
With these details in hand, it's time to sketch out a seating arrangement!
## Instructions
Your task is to find the perfect table seating.
You'll do this by declaring _facts_ (things that are always true) and _rules_ (things that are conditionally true).
## 1. List the chatty people
Define the `chatty` fact to represent the chatty people.
The `chatty` fact takes a single argument: the chatty person's lowercase name.
```prolog
chatty(gustavo).
true.
```
## 2. List who likes whom
Define the `likes` fact to represent who likes whom.
The `likes` fact takes two arguments:
1. The lowercase name of the person liking the other person
2. The lowercase name of the person being liked
```prolog
likes(esteban, malena).
true.
```
## 3. People who like each other make a good pairing
Define the `pairing` rule to be true when the two people both like each other.
The pairing rule takes two arguments:
1. The lowercase name of the first person
2. The lowercase name of the second person
```prolog
pairing(malena, esteban).
true.
```
## 4. Chatty people pair with anyone
Define the `pairing` rule to be true when (at least) one of the two people being paired is chatty.
```prolog
pairing(valeria, jaime).
true.
```
## 5. Check seating arrangement
Define the `seating` rule to be true when all five pairs are good pairings.
The pairing rule takes fives arguments:
1. The lowercase name of the first person
2. The lowercase name of the second person
3. The lowercase name of the third person
4. The lowercase name of the fourth person
5. The lowercase name of the fifth person
Use the just defined facts and rules to check the seating arrangement.
```prolog
seating(esteban, jaime, gustavo, malena, valeria).
false.
```
## Source
### Created by
- @erikschierboom

View file

@ -0,0 +1,20 @@
% Define the 'chatty' fact
chatty(gustavo).
chatty(valeria).
% Define the 'likes' fact
likes(esteban, malena).
likes(malena, esteban).
likes(gustavo, valeria).
% Define the 'pairing' rule
pairing(X, Y) :- likes(X, Y), likes(Y, X).
pairing(X, Y) :- chatty(X); chatty(Y).
% Define the 'seating' rule
seating(A,B,C,D,E) :-
pairing(A,B),
pairing(B,C),
pairing(C,D),
pairing(D,E),
pairing(E,A).

View file

@ -0,0 +1,48 @@
pending :-
current_prolog_flag(argv, ['--all'|_]).
pending :-
write('\nA TEST IS PENDING!\n'),
fail.
:- begin_tests(wedding_woes).
test(gustavo_is_chatty, condition(true)) :-
chatty(gustavo).
test(valeria_is_chatty, condition(pending)) :-
chatty(valeria).
test(jaime_is_not_chatty, [fail, condition(pending)]) :-
chatty(jaime).
test(esteban_likes_malena, condition(pending)) :-
likes(esteban, malena).
test(malena_likes_esteban, condition(pending)) :-
likes(malena, esteban).
test(gustavo_likes_valeria, condition(pending)) :-
likes(gustavo, valeria).
test(valeria_does_not_like_gustavo, [fail, condition(pending)]) :-
likes(valeria, gustavo).
test(people_who_like_each_other_make_a_good_pairing, condition(pending)) :-
pairing(malena, esteban).
test(two_chatty_people_make_a_good_pairing, condition(pending)) :-
pairing(gustavo, jaime).
test(one_chatty_person_make_a_good_pairing_with_anyone, condition(pending)) :-
pairing(valeria, jaime).
test(people_who_dont_like_each_other_and_are_not_chatty_dont_make_a_good_pairing, [fail, condition(pending)]) :-
pairing(rico, naran).
test(valid_seating, condition(pending)) :-
seating(esteban, malena, gustavo, jaime, valeria).
test(invalid_seating, [fail, condition(pending)]) :-
seating(esteban, jaime, gustavo, malena, valeria).
:- end_tests(wedding_woes).