新手关于一个四对夫妇的问题,求指导。。。
prolog吧
全部回复
仅看楼主
level 1
今年大三学习人工智能,关于归结原理的实验想用prolog实现。(其实是宿舍里面一个同学告诉我的,指导书上也推荐用这个)马虎看了一下教程关于这方面的,又看到丁兔大佬另一个类似问题的例子,自己也试着编了一下。但是语法不熟悉,出错自己也找不到,关于辨别性别方面感觉自己写的也是错的,希望大佬们能来指导一下。
问题描述:
四对夫妇中,王结婚时,周送了礼;周和钱是同一排球队的队员;李的爱人是陈的爱人的表哥;陈夫妇与邻居吵架时,徐、周、吴的爱人都去助战;李、徐、周结婚前住在同一宿舍,试用归结原理求王、周、钱、陈、李、徐、吴、孙几人谁和谁是夫妇。
我的程序:
human(wang).
hunan(zhou).
human(qian).
human(chen).
human(li).
human(xu).
human(wu).
human(sun).
%定义所有人
man(Man):-
human(Man),
\+ woman(Man).
woman(Woman):-
human(Woman),
\+ man(Woman).
%定义男女
spouse(Husband,Wife):-
man(Husband),
woman(Wife),
\+ notspouse(Husband,Wife).
%定义夫妻
notspouse(X,Y):-
notspouse(Y,X).
%spouse函数与函数参数顺序无关
spouse(H1,W1),
spouse(H2,W2),
spouse(H3,W3),
spouse(H4,W4),
man(H1),man(H2),man(H3),man(H4),
woman(W1),woman(W2),woman(W3),woman(W4),
H1 /= H2,H1 /= H3,H1/= H4,
H2 /= H3,H2 /= H4,
H3 /= H4,
W1 /= W2,W1 /= W3,W1/= W4,
W2 /= W3,W2 /= W4,
W3 /= W4.
%四队夫妻
notspouse(zhou,wang).
%王结婚时,周送了礼
notspouse(zhou,qian).
%周和钱是同一排球队的队员
notspouse(li,chen).
woman(li).
%李的爱人是陈的爱人的表哥
notspouse(chen,xu).
notspouse(chen,zhou).
notspouse(chen,wu).
notspouse(xu,zhou).
notspouse(xu,wu).
notspouse(zhou,wu).
%陈夫妇与邻居吵架时,徐、周、吴的爱人都去助战
woman(xu).
woman(zhou).
%李、徐、周结婚前住在同一宿舍(不会写直接推了)
出错情况:
Warning: c:/users/administrator/desktop/spouse.pl:3:
Clauses of human/1 are not together in the source-file
Earlier definition at c:/users/administrator/desktop/spouse.pl:1
Current predicate: hunan/1
Use :- discontiguous human/1. to suppress this message
ERROR: c:/users/administrator/desktop/spouse.pl:33:2: Syntax error: Operator expected
Warning: c:/users/administrator/desktop/spouse.pl:45:
Clauses of woman/1 are not together in the source-file
Earlier definition at c:/users/administrator/desktop/spouse.pl:14
Current predicate: notspouse/2
Use :- discontiguous woman/1. to suppress this message
Warning: c:/users/administrator/desktop/spouse.pl:47:
Clauses of notspouse/2 are not together in the source-file
Earlier definition at c:/users/administrator/desktop/spouse.pl:23
Current predicate: woman/1
Use :- discontiguous notspouse/2. to suppress this message
Warning: c:/users/administrator/desktop/spouse.pl:54:
Clauses of woman/1 are not together in the source-file
Earlier definition at c:/users/administrator/desktop/spouse.pl:14
Current predicate: notspouse/2
Use :- discontiguous woman/1. to suppress this message
Welcome to SWI-Prolog (threaded, 64 bits, version 7.6.4)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
Please run ?- license. for legal details.
For online help and background, visit http://www.swi-prolog.org
For built-in help, use ?- help(Topic). or ?- apropos(Word).
?- spouse(X,Y).
ERROR: Out of local stack
2018年04月27日 05点04分 1
level 13
看来是爆栈了
2018年04月28日 05点04分 2
程序里 不等于符号的斜杠 写反了。。。大佬帮我看下下面的问题吧[委屈]
2018年04月29日 07点04分
level 1
把推出来得性别作为已知之后,改进程序:
man(wang).
man(chen).
man(wu).
man(sun).
%推得男人
spouse(Husband,Wife):-
man(Husband),
woman(Wife),
\+ notspouse(Husband,Wife).
%定义夫妻
notspouse(zhou,wang).
notspouse(wang,zhou).
%王结婚时,周送了礼
notspouse(zhou,qian).
notspouse(qian,zhou).
woman(qian).
%周和钱是同一排球队的队员
notspouse(li,chen).
notspouse(chen,li).
woman(li).
%李的爱人是陈的爱人的表哥
notspouse(chen,xu).
notspouse(xu,chen).
notspouse(chen,zhou).
notspouse(zhou,chen).
notspouse(chen,wu).
notspouse(wu,chen).
notspouse(xu,zhou).
notspouse(zhou,xu).
notspouse(xu,wu).
notspouse(wu,xu).
notspouse(zhou,wu).
notspouse(wu,zhou).
%陈夫妇与邻居吵架时,徐、周、吴的爱人都去助战
woman(xu).
woman(zhou).
%李、徐、周结婚前住在同一宿舍(不会写直接推了)
solve:-
spouse(H1,W1),
spouse(H2,W2),
spouse(H3,W3),
spouse(H4,W4),
H1 \= H2,H1 \= H3,H1 \= H4,
H2 \= H3,H2 \= H4,
H3 \= H4,
W1 \= W2,W1 \= W3,W1 \= W4,
W2 \= W3,W2 \= W4,
W3 \= W4,
%四队夫妻
write(H1:W1),nl,
write(H2:W2),nl,
write(H3:W3),nl,
write(H4:W4),nl.
得到结果:
?- solve.
wang:xu
chen:qian
wu:li
sun:zhou
true
但还是想通过程序自己推性别。。。想问下一下逻辑如何表达:
(1)如果是人,那么ta为男人或女人。
(2)8个人中有4个男人,4个女人。
2018年04月29日 07点04分 3
(1): man(X):- human(X). woman(X):- human(X).
2018年04月29日 14点04分
逻辑(2)嘛,写起来也不难,就是太长了.
2018年04月29日 14点04分
level 13
逻辑(2)要写大概是这样吧
man(H1),man(H2),man(H3),man(H4),H1\=H2,H1\=H3,H1\=H4,H2\=H3,H2\=H4,H3\=H4,
woman(W1),woman(W2),woman(W3),woman(W4),W1\=W2,W1\=W3,W1\=W4,W2\=W3,W2\=W4,W3\=W4,
Hs=[H1,H2,H3,H4],Ws=[W1,W2,W3,W4],
\+ member(H1,Ws), \+ member(H2,Ws), \+member(H3,Ws), \+ member(H4,Ws),
\+ member(W1,Hs), \+ member(W2,Hs), \+ member(W3,Hs), \+ member(W4,Hs),
2018年04月29日 15点04分 4
这样写不光啰嗦,效率也很低,SWI有很多内部谓词,试着找找有没有能用的吧
2018年04月29日 15点04分
@丁兔 好的,我去看看了。谢谢😉😃
2018年04月30日 03点04分
level 1
最终得到有缺陷的程序为:
human(wang).
hunan(zhou).
human(qian).
human(chen).
human(li).
human(xu).
human(wu).
human(sun).
%定义所有人
man(Man):-
samesex(X,Man),man(X).
woman(Woman):-
samesex(Y,Woman),woman(Y).
man(Man):-
human(Man),
\+ woman(Man).
%得到性别
spouse(Husband,Wife):-
man(Husband),
woman(Wife),
\+ notspouse(Husband,Wife).
%定义夫妻
notspouse(zhou,wang).
notspouse(wang,zhou).
%王结婚时,周送了礼
notspouse(zhou,qian).
notspouse(qian,zhou).
samesex(zhou,qian).
%周和钱是同一排球队的队员
notspouse(li,chen).
notspouse(chen,li).
woman(li).
%李的爱人是陈的爱人的表哥
notspouse(chen,xu).
notspouse(xu,chen).
notspouse(chen,zhou).
notspouse(zhou,chen).
notspouse(chen,wu).
notspouse(wu,chen).
notspouse(xu,zhou).
notspouse(zhou,xu).
notspouse(xu,wu).
notspouse(wu,xu).
notspouse(zhou,wu).
notspouse(wu,zhou).
%陈夫妇与邻居吵架时,徐、周、吴的爱人都去助战
samesex(li,xu).
samesex(li,zhou).
%李、徐、周结婚前住在同一宿舍
couple:-
spouse(H1,W1),
spouse(H2,W2),
spouse(H3,W3),
spouse(H4,W4),
H1 \= H2,H1 \= H3,H1 \= H4,
H2 \= H3,H2 \= H4,
H3 \= H4,
W1 \= W2,W1 \= W3,W1 \= W4,
W2 \= W3,W2 \= W4,
W3 \= W4,
%四队夫妻
write(H1:W1),nl,
write(H2:W2),nl,
write(H3:W3),nl,
write(H4:W4),nl.
运行结果:
?- couple.
wang:xu
chen:qian
wu:li
sun:zhou
true
这是事前知道性别推导顺序的解法。
同时存在
samesex(li,xu).
samesex(xu,li).

man(Man):-
human(Man),
\+ woman(Man).
woman(Woman):-
human(Woman),
\+ man(Woman).
时,程序就会效率极低甚至爆栈,不知道是不是因为在两句中间陷入循环。
2018年05月01日 12点05分 5
就是你想的那样,死循环了
2018年05月01日 15点05分
1