Prolog 人工智能语言中文论坛---打造优质Prolog学习交流园地

一个供Prolog爱好者学习与交流的地方


您没有登录。 请登录注册

如何寫一個progle程式???

浏览上一个主题 浏览下一个主题 向下  留言 [第1页/共1页]

1 如何寫一個progle程式??? 于 周三 十一月 07, 2012 6:21 am

主程式如下:

family(
person( tom, fox, date(7,may,1960), works(bbc, 15200)),
person( ann, fox, date(9,may,1961), unemployed),
[person( pat, fox, date(5,may,1983), unemployed),
person( jim, fox, date(5,may,1983), unemployed)].

因為要建立10組家庭 然後增加查詢功能
例如:查詢有幾個小孩或是有工作的婦女等等的功能
我是想說寫個查詢父母年齡 或是 單親家庭的話
要怎麼寫呢??請大大們幫忙

查阅用户资料

2 回复: 如何寫一個progle程式??? 于 周三 十一月 07, 2012 10:13 am

nestea520 写道::主程式如下:

family(
person( tom, fox, date(7,may,1960), works(bbc, 15200)),
person( ann, fox, date(9,may,1961), unemployed),
[person( pat, fox, date(5,may,1983), unemployed),
person( jim, fox, date(5,may,1983), unemployed)].

因為要建立10組家庭 然後增加查詢功能
例如:查詢有幾個小孩或是有工作的婦女等等的功能
我是想說寫個查詢父母年齡 或是 單親家庭的話
要怎麼寫呢??請大大們幫忙

代码:
family(
person( tom, fox, date(7,may,1960), works(bbc, 15200)),
person( ann, fox, date(9,may,1961), unemployed),
[person( pat, fox, date(5,may,1983), unemployed), person( jim, fox, date(5,may,1983), unemployed)]
).

family(
person( amanda, seyfried, date(3,dec,1985), works(movie, 50000)),
[person( wendy, seyfried, date(6,jun,1990), unemployed)]
).


parent_age :- family(Dad, Mom, Child), write_age(Dad, Mom).
parent_age :- family(Parent, Child), write_age(Parent, _).

write_age(Dad, Mom) :-
              Dad = person(Dad_First_Name, Dad_Last_Name, date(D, M, Y), Work), Dad_Age is 2012 - Y,
              write(Dad_First_Name), write(' '), write(Dad_Last_Name), write('. Age: '), write(Dad_Age), nl,
              nonvar(Mom), Mom = person(Mom_First_Name, Mom_Last_Name, date(DD, MM, YY), WW), Mom_Age is 2012 - YY,
              write(Mom_First_Name), write(' '), write(Mom_Last_Name), write('. Age: '), write(Mom_Age), nl, false.

single_parent :- family(Parent, Child), Parent = person(Parent_First_Name, Parent_Last_Name, date(D, M, Y), Work),
                write('Single paranet family:'), nl, write(Parent_First_Name), write(' '), write(Parent_Last_Name), nl, false.


41 ?- parent_age.
tom fox. Age: 52
ann fox. Age: 51
amanda seyfried. Age: 27
false.

42 ?- single_parent.
Single paranet family:
amanda seyfried
false.

查阅用户资料 http://prolog.longluntan.net

3 謝謝您的幫忙 于 周四 十一月 08, 2012 6:43 pm

Mercury Liao 写道::
nestea520 写道::主程式如下:

family(
person( tom, fox, date(7,may,1960), works(bbc, 15200)),
person( ann, fox, date(9,may,1961), unemployed),
[person( pat, fox, date(5,may,1983), unemployed),
person( jim, fox, date(5,may,1983), unemployed)].

因為要建立10組家庭 然後增加查詢功能
例如:查詢有幾個小孩或是有工作的婦女等等的功能
我是想說寫個查詢父母年齡 或是 單親家庭的話
要怎麼寫呢??請大大們幫忙

代码:
family(
person( tom, fox, date(7,may,1960), works(bbc, 15200)),
person( ann, fox, date(9,may,1961), unemployed),
[person( pat, fox, date(5,may,1983), unemployed), person( jim, fox, date(5,may,1983), unemployed)]
).

family(
person( amanda, seyfried, date(3,dec,1985), works(movie, 50000)),
[person( wendy, seyfried, date(6,jun,1990), unemployed)]
).


parent_age :- family(Dad, Mom, Child), write_age(Dad, Mom).
parent_age :- family(Parent, Child), write_age(Parent, _).

write_age(Dad, Mom) :-
              Dad = person(Dad_First_Name, Dad_Last_Name, date(D, M, Y), Work), Dad_Age is 2012 - Y,
              write(Dad_First_Name), write(' '), write(Dad_Last_Name), write('. Age: '), write(Dad_Age), nl,
              nonvar(Mom), Mom = person(Mom_First_Name, Mom_Last_Name, date(DD, MM, YY), WW), Mom_Age is 2012 - YY,
              write(Mom_First_Name), write(' '), write(Mom_Last_Name), write('. Age: '), write(Mom_Age), nl, false.

single_parent :- family(Parent, Child), Parent = person(Parent_First_Name, Parent_Last_Name, date(D, M, Y), Work),
                write('Single paranet family:'), nl, write(Parent_First_Name), write(' '), write(Parent_Last_Name), nl, false.


41 ?- parent_age.
tom fox. Age: 52
ann fox. Age: 51
amanda seyfried. Age: 27
false.

42 ?- single_parent.
Single paranet family:
amanda seyfried
false.

程式若繼續寫10組家庭 可是在跑程式的時候 出現的答案還是只有你給的那兩個答案
請問要怎樣寫才能夠 都跑出來呢?
再請教一下 怎樣才能做只查詢 第一組家庭的年齡 或其他組家庭年齡呢? 謝謝

查阅用户资料

4 回复: 如何寫一個progle程式??? 于 周五 十一月 09, 2012 1:01 am

nestea520 写道::
Mercury Liao 写道::
nestea520 写道::主程式如下:

family(
person( tom, fox, date(7,may,1960), works(bbc, 15200)),
person( ann, fox, date(9,may,1961), unemployed),
[person( pat, fox, date(5,may,1983), unemployed),
person( jim, fox, date(5,may,1983), unemployed)].

因為要建立10組家庭 然後增加查詢功能
例如:查詢有幾個小孩或是有工作的婦女等等的功能
我是想說寫個查詢父母年齡 或是 單親家庭的話
要怎麼寫呢??請大大們幫忙

代码:
family(
person( tom, fox, date(7,may,1960), works(bbc, 15200)),
person( ann, fox, date(9,may,1961), unemployed),
[person( pat, fox, date(5,may,1983), unemployed), person( jim, fox, date(5,may,1983), unemployed)]
).

family(
person( amanda, seyfried, date(3,dec,1985), works(movie, 50000)),
[person( wendy, seyfried, date(6,jun,1990), unemployed)]
).


parent_age :- family(Dad, Mom, Child), write_age(Dad, Mom).
parent_age :- family(Parent, Child), write_age(Parent, _).

write_age(Dad, Mom) :-
              Dad = person(Dad_First_Name, Dad_Last_Name, date(D, M, Y), Work), Dad_Age is 2012 - Y,
              write(Dad_First_Name), write(' '), write(Dad_Last_Name), write('. Age: '), write(Dad_Age), nl,
              nonvar(Mom), Mom = person(Mom_First_Name, Mom_Last_Name, date(DD, MM, YY), WW), Mom_Age is 2012 - YY,
              write(Mom_First_Name), write(' '), write(Mom_Last_Name), write('. Age: '), write(Mom_Age), nl, false.

single_parent :- family(Parent, Child), Parent = person(Parent_First_Name, Parent_Last_Name, date(D, M, Y), Work),
                write('Single paranet family:'), nl, write(Parent_First_Name), write(' '), write(Parent_Last_Name), nl, false.


41 ?- parent_age.
tom fox. Age: 52
ann fox. Age: 51
amanda seyfried. Age: 27
false.

42 ?- single_parent.
Single paranet family:
amanda seyfried
false.

程式若繼續寫10組家庭 可是在跑程式的時候 出現的答案還是只有你給的那兩個答案
請問要怎樣寫才能夠 都跑出來呢?
再請教一下 怎樣才能做只查詢 第一組家庭的年齡 或其他組家庭年齡呢? 謝謝

你是不是没有按一定的格式输入数据?
因为在程式不修改的情况下,我这里试是可以全跑出来的,如下:


假设现在有4个家庭:

代码:
family(
person( tom, fox, date(7,may,1960), works(bbc, 15200)),
person( ann, fox, date(9,may,1961), unemployed),
[person( pat, fox, date(5,may,1983), unemployed), person( jim, fox, date(5,may,1983), unemployed)]
).

family(
person( amanda, seyfried, date(3,dec,1985), works(movie, 50000)),
[person( wendy, seyfried, date(6,jun,1990), unemployed)]
).

family(
person( a, b, date(3,dec,1912), works(movie, 50000)),
[person( c, b, date(6,jun,1990), unemployed)]
).

family(
person( w, x, date(3,dec,1981), works(movie, 50000)),
person( x, x, date(3,dec,1987), works(movie, 50000)),
[person( y, x, date(6,jun,1990), unemployed)]
).

11 ?- parent_age.
tom fox. Age: 52
ann fox. Age: 51
w x. Age: 31
x x. Age: 25
amanda seyfried. Age: 27
a b. Age: 100
false.

12 ?- single_parent.
Single paranet family:
amanda seyfried
Single paranet family:
a b
false.

全都有印出来啊!

查阅用户资料 http://prolog.longluntan.net

5 回复: 如何寫一個progle程式??? 于 周五 十一月 09, 2012 1:05 am

nestea520 写道::
Mercury Liao 写道::
nestea520 写道::主程式如下:

family(
person( tom, fox, date(7,may,1960), works(bbc, 15200)),
person( ann, fox, date(9,may,1961), unemployed),
[person( pat, fox, date(5,may,1983), unemployed),
person( jim, fox, date(5,may,1983), unemployed)].

因為要建立10組家庭 然後增加查詢功能
例如:查詢有幾個小孩或是有工作的婦女等等的功能
我是想說寫個查詢父母年齡 或是 單親家庭的話
要怎麼寫呢??請大大們幫忙

代码:
family(
person( tom, fox, date(7,may,1960), works(bbc, 15200)),
person( ann, fox, date(9,may,1961), unemployed),
[person( pat, fox, date(5,may,1983), unemployed), person( jim, fox, date(5,may,1983), unemployed)]
).

family(
person( amanda, seyfried, date(3,dec,1985), works(movie, 50000)),
[person( wendy, seyfried, date(6,jun,1990), unemployed)]
).


parent_age :- family(Dad, Mom, Child), write_age(Dad, Mom).
parent_age :- family(Parent, Child), write_age(Parent, _).

write_age(Dad, Mom) :-
              Dad = person(Dad_First_Name, Dad_Last_Name, date(D, M, Y), Work), Dad_Age is 2012 - Y,
              write(Dad_First_Name), write(' '), write(Dad_Last_Name), write('. Age: '), write(Dad_Age), nl,
              nonvar(Mom), Mom = person(Mom_First_Name, Mom_Last_Name, date(DD, MM, YY), WW), Mom_Age is 2012 - YY,
              write(Mom_First_Name), write(' '), write(Mom_Last_Name), write('. Age: '), write(Mom_Age), nl, false.

single_parent :- family(Parent, Child), Parent = person(Parent_First_Name, Parent_Last_Name, date(D, M, Y), Work),
                write('Single paranet family:'), nl, write(Parent_First_Name), write(' '), write(Parent_Last_Name), nl, false.


41 ?- parent_age.
tom fox. Age: 52
ann fox. Age: 51
amanda seyfried. Age: 27
false.

42 ?- single_parent.
Single paranet family:
amanda seyfried
false.

程式若繼續寫10組家庭 可是在跑程式的時候 出現的答案還是只有你給的那兩個答案
請問要怎樣寫才能夠 都跑出來呢?
再請教一下 怎樣才能做只查詢 第一組家庭的年齡 或其他組家庭年齡呢? 謝謝

至于你的第2个问题,可以修改程序如下:

代码:
parent_age :- family(Dad, Mom, Child), write_age(Dad, Mom), false.
parent_age :- family(Parent, Child), write_age(Parent, _), false.

write_age(Dad, Mom) :-
              Dad = person(Dad_First_Name, Dad_Last_Name, date(D, M, Y), Work), Dad_Age is 2012 - Y,
              write(Dad_First_Name), write(' '), write(Dad_Last_Name), write('. Age: '), write(Dad_Age), nl,
              nonvar(Mom), Mom = person(Mom_First_Name, Mom_Last_Name, date(DD, MM, YY), WW), Mom_Age is 2012 - YY,
              write(Mom_First_Name), write(' '), write(Mom_Last_Name), write('. Age: '), write(Mom_Age), nl.

single_parent :- family(Parent, Child), Parent = person(Parent_First_Name, Parent_Last_Name, date(D, M, Y), Work),
                write('Single paranet family:'), nl, write(Parent_First_Name), write(' '), write(Parent_Last_Name), nl, false.
               

parent_age(FN, LN) :- family(Dad, Mom, Child),
                      Dad = person(Dad_First_Name, Dad_Last_Name, date(D, M, Y), Work), Mom = person(Mom_First_Name, Mom_Last_Name, date(DD, MM, YY), WW),
                      ((Dad_First_Name = FN, Dad_Last_Name = LN); (Mom_First_Name = FN, Mom_Last_Name = LN)), write_age(Dad, Mom).

parent_age(FN, LN) :- family(Parent, Child), Parent = person(Parent_First_Name, Parent_Last_Name, date(D, M, Y), Work),
                      Parent_First_Name = FN, Parent_Last_Name = LN, write_age(Parent, _).

21 ?- parent_age(tom, fox).
tom fox. Age: 52
ann fox. Age: 51
true .

22 ?- parent_age(ann, fox).
tom fox. Age: 52
ann fox. Age: 51
true .

23 ?- parent_age(amanda, seyfried).
amanda seyfried. Age: 27
false.

如果你怕名字有重复的情况,那必须在数据的格式上增加一个参数用以表示id,
id不重复,这样就能精准的查到你想查到的家庭。

查阅用户资料 http://prolog.longluntan.net

6 回复: 如何寫一個progle程式??? 于 周五 十一月 09, 2012 3:48 am

nestea520 写道::主程式如下:

family(
person( tom, fox, date(7,may,1960), works(bbc, 15200)),
person( ann, fox, date(9,may,1961), unemployed),
[person( pat, fox, date(5,may,1983), unemployed),
person( jim, fox, date(5,may,1983), unemployed)].

因為要建立10組家庭 然後增加查詢功能
例如:查詢有幾個小孩或是有工作的婦女等等的功能
我是想說寫個查詢父母年齡 或是 單親家庭的話
要怎麼寫呢??請大大們幫忙

这是要做数据库功能,我的处理方式较像是经过正规化的方式。
代码:
person('Tom', 'Fox', birthday:1960/'May'/7, work:bbc/15200).
person('Ann', 'Fox', birthday:1961/'May'/9, unemployed).
person('Pat', 'Fox', birthday:1983/'May'/5, unemployed).
person('Jim', 'Fox', birthday:1983/'May'/5, unemployed).
family(['Tom', 'Ann'], ['Pat', 'Jim']).
father('Tom', 'Pat').
father('Tom', 'Jim').
mother('Ann', 'Pat').
mother('Ann', 'Jim').

首先要说,家庭要明确定义,是直接的直系血亲,父母和儿女构成一个单位的家庭。至於扩充说亲友们彼此你我都是一家人,则要写更扩大的查询,构成应该是树结构。我的做法是首先在ground层面把家庭及成员、各人的身份和出生都定义好。资料定义好,写查询就很好写:例如查小孩的数目、查妈妈是职业妇女,
代码:
%% num_children(-Family, +N)
num_children(Family, N) :- Family = [_, Children],
    length(Children, N).
employed_women(Family, Person) :- Family = [Parents, _],
    member(Person, Parents),
    mother(Person, _),
    person(Person, _, _, work:_).
查询很简单,而前提是定义明确, num_children(-Family, +N) 就是只能先有Family=[Parents,Children]才能求小孩数目,但你可见求小孩数量的语句非常简单。

同理,查各人的年纪、查单亲家庭,如下:
代码:
age(Person, Age, Time) :- Time = Y/_/_,
    person(Person, _, birthday:Y1/_/_, _),
    Age is Y-Y1+1.
has_both_parents(Family) :- Family = [Parents, _],
    member(Father, Parents),
    member(Mother, Parents),
    Father \= Mother,
    (father(Father, _), not(mother(Father,_))),
    (mother(Mother, _), not(father(Mother,_))).
is_single_parent(Family) :- not(has_both_parents(Family)).
单亲家庭想法很简单,看一个家庭找得到爸爸和妈妈,就是完整家庭,否则是单亲家庭。

以上是我的设计方法。每个人的设计方法会有些不同,请随意参考。

查阅用户资料 http://yauhsien.wordpress.com

7 謝謝大家 于 周四 十一月 15, 2012 6:54 am

因為剛學prolog 且老師要求的作業
所以來請教大家 謝謝

查阅用户资料

8 回复: 如何寫一個progle程式??? 于 周四 十一月 15, 2012 7:16 am

nestea520 写道::因為剛學prolog 且老師要求的作業
所以來請教大家 謝謝

什么课要求学prolog?

查阅用户资料 http://prolog.longluntan.net

9 大學的課 于 周四 十一月 15, 2012 7:31 am

專家系統程式設計這門課

查阅用户资料

10 想在請問一下 于 周三 十一月 21, 2012 6:22 am

因為查年齡 parent_age.
只會印出家長年齡 若是只想查詢小朋友年齡的話 要在加入甚麼呢??

查阅用户资料

11 回复: 如何寫一個progle程式??? 于 周三 十一月 21, 2012 6:44 am

nestea520 写道::因為查年齡 parent_age.
只會印出家長年齡 若是只想查詢小朋友年齡的話 要在加入甚麼呢??

你是想列出所有家庭的小孩年龄,
还是根据某个家长姓名查询小孩年龄呢?

查阅用户资料 http://prolog.longluntan.net

12 回复: 如何寫一個progle程式??? 于 周三 十一月 21, 2012 8:39 am

Mercury Liao 写道::
nestea520 写道::因為查年齡 parent_age.
只會印出家長年齡 若是只想查詢小朋友年齡的話 要在加入甚麼呢??

你是想列出所有家庭的小孩年龄,
还是根据某个家长姓名查询小孩年龄呢?

想列出某家長的小孩 或是 全部小孩列出 要怎麼寫呢?

主程式:

family(
person( tom, fox, date(7,may,1960), works(bbc, 15200)),
person( ann, fox, date(9,may,1961), unemployed),
[person( pat, fox, date(5,may,1983), unemployed),
person( jim, fox, date(5,may,1983), unemployed)].

husband(X) :- family(X, _, _).
wife(X) :- family(_, X, _).
child(X) :- family(_,_,Childred), member(X, Children).
exists(Person) :- husband(Person); wife(Person); child(Person).

若是這樣寫 那上面的查詢年齡程式及單親又要如何改呢?

查阅用户资料

浏览上一个主题 浏览下一个主题 返回页首  留言 [第1页/共1页]

您在这个论坛的权限:
不能在这个论坛回复主题