Проблема с прологом: Проблемы с переменными (если они мне нужны или нет) - PullRequest
0 голосов
/ 26 апреля 2020

Я работаю над последним заданием для своего класса, и мне было интересно, может ли кто-нибудь помочь мне разобраться с этими двумя проблемами (C и D), которые я оставил. Это то, что у меня есть на данный момент. Я не ищу прямой ответ. Может кто-то просто наставить меня примером. Я выполнил а и б задания, которое состоит в том, чтобы найти всех работающих детей и названия семей без детей. Нам были даны некоторые служебные функции, поэтому нам не нужно, например, каждый раз определять ребенка. Вот пример данных генеалогического дерева. Это долго, поэтому я пристроил здесь только одну семью.

family(
        person(melvin, brown, date(25,april,1950), unemployed),
        person(alice, brown, date(2,september,1967), works(hom, 78000)),
        [person(bill, brown, date(18,november,1990), unemployed),
         person(grace, brown, date(18,november,1990), works(ibm, 55000)),
         person(barbara, brown, date(18,november,1990), unemployed),
         person(walter, brown, date(3, october, 1996), unemployed)] ).

, и вот для нас определены следующие качества:

del(X, [X|Tail], Tail).

del(X, [Y|Tail], [Y|Tail1]) :- del(X, Tail, Tail1). 

husband(X) :- family(X, _, _).

wife(X) :- family(_, X, _).

child(X) :- family(_, _, Children), member(X, Children). 

exists(Person) :- husband(Person); wife(Person); child(Person).

dateofbirth(person(_, _, Date, _), Date).

salary(person(_, _, _, works(_, S) ), S).  % Salary of working person

salary(person(_, _, _, unemployed), 0). % Salary of unemployed

Вот моя работа на данный момент :

(a) Названия семей без детей

? - family(_, person(Name, Surname, _, _), [])

(b) всех работающих детей

? – child(person(Name, Surname, _, works (_, _)))

(c) имена семей с работающими женами и безработными мужьями

? – wife(person), 

family(_, person(Name, Surname, _, works (_, _)));

husband(person),

family(_, person(Name, Surname, _, unemployed))) 

(d) все дети, чьи родители различаются по возрасту не менее чем на 15 лет

  • Я действительно не знаю, с чего начать. Потому что я не понимаю, как вы можете минус два возраста родителей логически. Я не знаю, имеет ли это смысл

1 Ответ

1 голос
/ 26 апреля 2020

Относительно (c) вы должны использовать прописные буквы для переменных. это будет wife(WifePerson), иначе ваш подзапрос wife(person) не может быть успешным). В качестве альтернативы вы также можете написать wife(person(Name,Surname,_,_....). Сказав, что предикат жена и муж совершенно лишние в вашем запросе. Однако я лично предпочел бы написать

family(Husband,Wive,_),Wive = person(_,_,_,works(_,_));false.

или жену соответственно.

Относительно (d) будет причудливый ответ, который требует написать возраст родителей, используя аксиомы Пеано. Это было бы крутой домашней работой. Идея состоит в том, что

nat(0). % zero is a natural number
nat(s(X)) :- nat(X). every successor of a natural number is a natural number

Теперь вы можете определить вычитание как

sub(nat(X),nat(0),nat(X)).
sub(nat(s(X),nat(s(Y),Result) :- sub(nat(X),nat(Y),Result)

, но кажется, что определение возрастов было сделано ленивым способом. Следовательно, вы можете использовать предикат инфикса is/2 и просто написать

  AgeDiff is X - Y.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...